दिलचस्प पोस्ट
प्रोग्रामेटिक रूप से एक वैश्विक (मॉड्यूल) वैरिएबल कैसे सेट करें? सेमीकेक पुस्तकालयों को स्वचालित रूप से अन्य सेंमीक संकुल द्वारा सुलभ बनाना क्या आप MySQL में तालिका नामों के रूप में संख्याओं का उपयोग करने की अनुमति देते हैं? JavaFX 2.1: टूलकिट को आरम्भ नहीं किया गया पेपैल पहुंच – SSL प्रमाणपत्र: स्थानीय जारीकर्ता प्रमाणपत्र प्राप्त करने में असमर्थ PHP / अपाचे: PHP गंभीर त्रुटि: अपरिभाषित फ़ंक्शन mysql_connect () पर कॉल करें रेगेक्स पैटर्न को मैच करने के लिए, को छोड़कर जब … / बीच में को छोड़कर JQuery का उपयोग कर चेकबॉक्स पर चेक / अनचेक किए गए राज्यों पर एक तत्व कैसे दिखाना / छुपाएं? अजगर में बैकस्लैश का उपयोग करना (बचने के लिए नहीं) ट्रांसजेन स्पेस बढ़ाएं Brk () सिस्टम कॉल क्या करता है? मिलीसेकंड परिशुद्धता के साथ टाइमस्टैम्प: उन्हें MySQL में कैसे बचाया जाता है JQuery का उपयोग करके PHP $ _SESSION सेट करना क्यों विम अजगर फाइलों में मेरे विस्तारक का पालन नहीं करता? वेबव्यू में बुनियादी प्रमाणीकरण को कैसे संभालना है

वसंत CSRF टोकन काम नहीं करता है, जब अनुरोध भेजा जा रहा है तो एक बहु-अनुरोध अनुरोध है

मैं उपयोग करता हूं,

  • स्प्रिंग फ़्रेमवर्क 4.0.0 रिलेज (जीए)
  • स्प्रिंग सुरक्षा 3.2.0 रिलेज (जीए)
  • स्ट्रट्स 2.3.16

जिसमें, मैं सीएसआरएफ के हमलों से बचाने के लिए इन-निर्मित सुरक्षा टोकन का उपयोग करता हूं

स्ट्रट्स फॉर्म निम्न की तरह दिखाई देता है

<s:form namespace="/admin_side" action="Category" enctype="multipart/form-data" method="POST" validate="true" id="dataForm" name="dataForm"> <s:hidden name="%{#attr._csrf.parameterName}" value="%{#attr._csrf.token}"/> </s:form> 

उत्पन्न HTML कोड निम्नानुसार है

 <form id="dataForm" name="dataForm" action="/TestStruts/admin_side/Category.action" method="POST" enctype="multipart/form-data"> <input type="hidden" name="_csrf" value="3748c228-85c6-4c3f-accf-b17d1efba1c5" id="dataForm__csrf"> </form> 

यह ठीक काम करता है, जब तक कि अनुरोध मल्टीपार्ट न हो , तो उस स्थिति कोड 403 के साथ अनुरोध समाप्त होता है।

HTTP स्थिति 403 – अवैध सीएसआरएफ टोकन 'रिक्त' अनुरोध पैरामीटर '_csrf' या हेडर 'एक्स-सीएसआरएफ-टोकन' पर पाया गया था।

प्रकार की स्थिति रिपोर्ट

संदेश अमान्य सीएसआरएफ टोकन 'नल' अनुरोध पैरामीटर '_csrf' या हेडर 'एक्स-सीएसआरएफ-टोकन' पर पाया गया था।

विवरण निर्दिष्ट संसाधनों तक पहुंच मना कर दिया गया है

spring-security.xmlspring-security.xml फ़ाइल इस प्रकार है

 <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd"> <http pattern="/Login.jsp*" security="none"></http> <http auto-config='true' use-expressions="true" disable-url-rewriting="true" authentication-manager-ref="authenticationManager"> <session-management session-fixation-protection="newSession"> <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> </session-management> <csrf/> <headers> <xss-protection /> <frame-options /> <!--<cache-control />--> <!--<hsts />--> <content-type-options /> <!--content sniffing--> </headers> <intercept-url pattern="/admin_side/**" access="hasRole('ROLE_ADMIN')" requires-channel="any"/> <form-login login-page="/admin_login/Login.action" authentication-success-handler-ref="loginSuccessHandler" authentication-failure-handler-ref="authenticationFailureHandler"/> <logout logout-success-url="/admin_login/Login.action" invalidate-session="true" delete-cookies="JSESSIONID"/> </http> <beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> <beans:bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> <beans:property name="userDetailsService" ref="userDetailsService"/> <beans:property name="passwordEncoder" ref="encoder" /> </beans:bean> <beans:bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager"> <beans:property name="providers"> <beans:list> <beans:ref bean="daoAuthenticationProvider" /> </beans:list> </beans:property> </beans:bean> <authentication-manager> <authentication-provider user-service-ref="userDetailsService"> </authentication-provider> </authentication-manager> <beans:bean id="loginSuccessHandler" class="loginsuccesshandler.LoginSuccessHandler"/> <beans:bean id="authenticationFailureHandler" class="loginsuccesshandler.AuthenticationFailureHandler" /> <global-method-security secured-annotations="enabled" proxy-target-class="false" authentication-manager-ref="authenticationManager"> <protect-pointcut expression="execution(* admin.dao.*.*(..))" access="ROLE_ADMIN"/> </global-method-security> </beans:beans> 

तो, इस टोकन को देखने के लिए, जब एक अनुरोध बहुपक्षीय है? (यह स्ट्रॉप्स से संबंधित नहीं होना चाहिए।)

UserDetailsService का कार्यान्वयन मेरे पहले के इस प्रश्न में पाया जा सकता है, यदि आवश्यक हो


स्प्रिंग सुरक्षा से पहले MultipartFilter रखकर या तो मदद नहीं की।

वेब। web.xml फ़ाइल निम्न की तरह दिखती है

 <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext.xml /WEB-INF/spring-security.xml </param-value> </context-param> <filter> <filter-name>MultipartFilter</filter-name> <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> </filter> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>MultipartFilter</filter-name> <servlet-name>/*</servlet-name> </filter-mapping> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>AdminLoginNocacheFilter</filter-name> <filter-class>filter.AdminLoginNocacheFilter</filter-class> </filter> <filter-mapping> <filter-name>AdminLoginNocacheFilter</filter-name> <url-pattern>/admin_login/*</url-pattern> </filter-mapping> <filter> <filter-name>NoCacheFilter</filter-name> <filter-class>filter.NoCacheFilter</filter-class> </filter> <filter-mapping> <filter-name>NoCacheFilter</filter-name> <url-pattern>/admin_side/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <description>Description</description> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <listener> <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> </listener> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>struts.devMode</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> 

यह केवल तभी काम करता है, जब टोकन को क्वेरी-स्ट्रिंग पैरामीटर के रूप में जोड़ा जाता है, हालांकि, जो निराश है।

 <s:form namespace="/admin_side" action="Category?%{#attr._csrf.parameterName}=%{#attr._csrf.token}" enctype="multipart/form-data" method="POST" validate="true" id="dataForm" name="dataForm"> ... <s:form> 

Solutions Collecting From Web of "वसंत CSRF टोकन काम नहीं करता है, जब अनुरोध भेजा जा रहा है तो एक बहु-अनुरोध अनुरोध है"

यदि आप @ ऍनोटेशन का प्रयोग कर रहे हैं, और इस तरह से jsp दृश्य:

  <form:form id="profileForm" action="profile?id=${param.id}" method="POST" modelAttribute="appUser" enctype="multipart/form-data" > ... <input type="file" name="file"> ... <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> </form:form> 

यह मदद कर सकता है:

AppConfig.java:

 @EnableWebMvc @Configuration @Import({ SecurityConfig.class }) public class AppConfig { @Bean(name = "filterMultipartResolver") public CommonsMultipartResolver filterMultipartResolver() { CommonsMultipartResolver filterMultipartResolver = new CommonsMultipartResolver(); filterMultipartResolver.setDefaultEncoding("utf-8"); // resolver.setMaxUploadSize(512000); return filterMultipartResolver; } ... 

SecurityConfig.java WebSecurityConfigurerAdapter बढ़ाता है और SpringSecurity के लिए कॉन्फ़िगरेशन है

मल्टीपार्ट / फॉर्म-डेटा फिल्टर (मल्टीपार्टफ़िल्टर) को सुरक्षा कॉन्फ़फ़िग से पहले पंजीकृत करना होगा जो कि सीएसआरएफ को सक्षम करता है। आप इसे इसके साथ कर सकते हैं:

SecurityInitializer.java:

 public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer { @Override protected void beforeSpringSecurityFilterChain(ServletContext servletContext) { super.beforeSpringSecurityFilterChain(servletContext); // CSRF for multipart form data filter: FilterRegistration.Dynamic springMultipartFilter; springMultipartFilter = servletContext.addFilter( "springMultipartFilter", new MultipartFilter()); springMultipartFilter.addMappingForUrlPatterns(null, false, "/*"); } } 

इस मामले में, चूंकि यह एक मल्टीपार्ट अनुरोध है जिसमें सीएसआरएफ टोकन स्प्रिंग सुरक्षा के लिए अनुपलब्ध है, जब तक कि MultipartFilter के साथ मल्टीपार्ट MultipartResolver ठीक से कॉन्फ़िगर नहीं हो जाता है, इसलिए मल्टीपार्ट अनुरोध वसंत द्वारा संसाधित किया जा सकता है।

MulipartResolver फ़ाइल में MulipartResolver निम्नानुसार पंजीकृत होना होगा

 <bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="-1" /> </bean> 

maxUploadSize का विशेषता मान -1 अपलोड किए गए फ़ाइल आकार पर कोई सीमा नहीं डालता है। यह मान आवश्यकताओं के आधार पर भिन्न हो सकती है एकाधिक फ़ाइलों के मामले में, फ़ाइल आकार सभी अपलोड की गई फ़ाइलों का आकार है


इसके अलावा,

 <servlet-name>/*</servlet-name> 

MultipartFilter के <filter-mapping> को बदलना होगा

 <url-pattern>/*</url-pattern> 

यह दस्तावेज़ीकरण में एक बग है

यह सिर्फ ठीक काम करेगा, अगर यह अकेले वसंत MVC है

लेकिन अगर यह स्प्रिंग और स्ट्रटस (2) का एकीकरण है, तो यह संबद्ध स्ट्रश्स एक्शन क्लास में एक अन्य समस्या का सामना कर रहा है। अपलोड की गई फ़ाइल की जानकारी संबंधित स्ट्रश्स एक्शन क्लास (एसएस) में null हो जाएगी।

इस विशिष्ट समस्या को हल करने के लिए, एक मल्टीपार्ट अनुरोध को कस्टमाइज़ करने के लिए यह उत्तर देखें।

मैंने इस समस्या को हल किया:

  • वेनिला जावास्क्रिप्ट का उपयोग करते हुए मल्टी-पार्ट फाइल भेजना, जैसे मोज़िला की मार्गदर्शिका
  • मेटा टैग में, HTML हेडर में _csrf टोकन को जोड़ने, जैसे कि एएसएक्स के साथ सीएसआरएफ टोकन भेजने के लिए स्प्रिंग दिशानिर्देश में
  • jquery का उपयोग करने के बजाय, इसे सीधे XHR ऑब्जेक्ट में जोड़ना

     var csrfToken = $("meta[name='_csrf']").attr("content"); var csrfHeader = $("meta[name='_csrf_header']").attr("content"); XHR.setRequestHeader(csrfHeader, csrfToken); XHR.setRequestHeader('Content-Type','multipart/form-data; boundary=' + boundary); XHR.send(data); 

आप csrf – httpSecurity.csrf () निष्क्रिय कर सकते हैं। अक्षम करें ();

  @Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity httpSecurity) throws Exception { ... httpSecurity.csrf().disable(); ... } }