दिलचस्प पोस्ट
IGrouping से मूल्य कैसे प्राप्त करें I Linq में Row_number over (xxx द्वारा विभाजन)? : सक्रिय छद्म वर्ग मोबाइल सफारी में काम नहीं करता है सबसे लंबे समय तक बढ़ते हुए बदलाव यूटीएफ -8 एन्कोडिंग में किसी भी चीनी चरित्र से मिलान करने के लिए नियमित अभिव्यक्ति का उपयोग करें आईफोन ओएस मेमोरी चेतावनी अलग स्तर क्या मतलब है? पायथन – लीजेंड पाई चार्ट के साथ ओवरलैप करता है शुरुआती के लिए मर्कुरियल: द डेफिनिटिकल प्रैक्टिकल गाइड इनफ़िक्स अभिव्यक्ति को पोस्टफिक्स एक्सप्रेशंस में कनवर्ट करते समय कोष्ठक को संभालना साधारण एचटीएमएल डीएम: तत्व कैसे निकालें? जावा स्ट्रिंग के SHA-1 डाइजेस्ट के हेक्स प्रतिनिधित्व की गणना करता है कच्चे मान को एक <input type = "number"> फ़ील्ड कैसे प्राप्त करें? ईएफ संहिता में सबसे पहले मैं अपने तालिकाओं को कैसे अलग करता हूं? बिना प्रवेश टोकन के फेसबुक ग्राफ़ एपी का उपयोग करके सार्वजनिक पृष्ठ की स्थिति प्राप्त करें प्रतिबिंब का उपयोग कर आप पैकेज में सभी कक्षाएं पा सकते हैं?

वसंत 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> 

वेब के समाधान से एकत्रित समाधान "वसंत 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(); ... } }