अमान्य CSRF टोकन 'null' अनुरोध पैरामीटर '_csrf' या हेडर 'X-CSRF-TOKEN' पर पाया गया था


90

स्प्रिंग सुरक्षा 3.2 को कॉन्फ़िगर करने के बाद, _csrf.tokenअनुरोध या सत्र ऑब्जेक्ट के लिए बाध्य नहीं है।

यह वसंत सुरक्षा विन्यास है:

<http pattern="/login.jsp" security="none"/>

<http>
    <intercept-url pattern="/**" access="ROLE_USER"/>
    <form-login login-page="/login.jsp"
                authentication-failure-url="/login.jsp?error=1"
                default-target-url="/index.jsp"/>
    <logout/>
    <csrf />
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="test" password="test" authorities="ROLE_USER/>
        </user-service>
    </authentication-provider>
</authentication-manager>

Login.jsp फ़ाइल

<form name="f" action="${contextPath}/j_spring_security_check" method="post" >
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
    <button id="ingresarButton"
            name="submit"
            type="submit"
            class="right"
            style="margin-right: 10px;">Ingresar</button>
    <span>
        <label for="usuario">Usuario :</label>
        <input type="text" name="j_username" id="u" class="" value=''/>
    </span>
    <span>
        <label for="clave">Contrase&ntilde;a :</label>

        <input type="password"
               name="j_password"
               id="p"
               class=""
               onfocus="vc_psfocus = 1;"
               value="">
    </span>
</form>

और यह अगले html को प्रस्तुत करता है:

<input type="hidden" name="" value="" />

परिणाम 403 HTTP स्थिति:

Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.

अद्यतन कुछ डीबग के बाद, अनुरोध ऑब्जेक्ट ठीक प्रपत्र DelegatingFilterProxy हो जाता है, लेकिन CoyoteAdapter की लाइन 469 में यह request.recycle () निष्पादित करता है; जो सभी विशेषताओं को मिटा देता है ...

मैं टॉमकैट 6.0.36, 7.0.50 में JDK 1.7 के साथ परीक्षण करता हूं।

मैंने इस व्यवहार को नहीं समझा है, बजाय, यह संभव होगा यदि कोई मुझे स्प्रिंग सिक्योरिटी 3.2 के साथ कुछ एप्लिकेशन सैंपल युद्ध की दिशा में इंगित करता है जो सीएसआरएफ के साथ काम करता है।


1
आप किस स्प्रिंग संस्करण का उपयोग करते हैं? spring-security.xmlस्प्रिंग 4.0.0 RELEASE (GA), स्प्रिंग सिक्योरिटी 3.2.0 RELEASE (GA) के साथ यही बात मेरे लिए काम करती है (हालांकि इसमें अंतर है ), हालांकि यह स्ट्रट्स 2.3.16 के साथ एकीकृत है। मैंने इसे नहीं दिया। स्प्रिंग MVC के साथ अकेले प्रयास करें)। हालाँकि यह विफल रहता है, जब अनुरोध 403 के साथ फाइल अपलोड करने के लिए मल्टीपार्ट है । मैं इसके लिए एक समाधान खोजने के लिए संघर्ष कर रहा हूं।
छोटे

स्प्रिंग 3.2.6, स्प्रिंग सिक्योरिटी 3.2.0, सीएसआरएफ, टोकन http-request ऑब्जेक्ट में जोड़ा गया था, सत्र ऑब्जेक्ट अनुरोध थ्रेड के साथ समान है, लेकिन जब तक इसके रेंडर jsp सभी विशेषताओं को हटाते हैं और केवल एक विशेषता छोड़ें ... फ़िल्टर_एप्प्लाइड
ह्यूगो

@ टिनी: क्या आपको कभी मल्टीपार्ट समस्या का हल मिला? मैं आ रही हैं सटीक एक ही मुद्दा।
रॉब जोहान्सन

1
@AlienBishop: हाँ, कृपया इस उत्तर को देखें (यह स्प्रिंग और स्ट्रट्स के संयोजन का उपयोग करता है)। यदि आपके पास अकेले स्प्रिंग एमवीसी है, तो कृपया इस उत्तर को देखें। यह ध्यान दिया जाना चाहिए कि फिल्टर का क्रम web.xmlमहत्वपूर्ण है। MultipartFilterपहले घोषित किया जाना चाहिए springSecurityFilterChain। उम्मीद है की वो मदद करदे। धन्यवाद।
टिनी

जवाबों:


110

ऐसा लगता है कि आपके स्प्रिंग एप्लिकेशन में CSRF (क्रॉस साइट रिक्वेस्ट फोर्जरी) सुरक्षा सक्षम है। वास्तव में यह डिफ़ॉल्ट रूप से सक्षम है।

वसंत के अनुसार ।io :

आपको सीएसआरएफ सुरक्षा का उपयोग कब करना चाहिए? हमारी अनुशंसा किसी भी अनुरोध के लिए CSRF सुरक्षा का उपयोग करना है जिसे सामान्य उपयोगकर्ताओं द्वारा ब्राउज़र द्वारा संसाधित किया जा सकता है। यदि आप केवल गैर-ब्राउज़र क्लाइंट द्वारा उपयोग की जाने वाली सेवा बना रहे हैं, तो आप संभवतः CSRF सुरक्षा को अक्षम करना चाहेंगे।

तो इसे निष्क्रिय करने के लिए:

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

यदि आप सीएसआरएफ सुरक्षा को सक्षम रखना चाहते हैं, तो आपको अपने फॉर्म में शामिल करना होगा csrftoken। आप इसे इस तरह से कर सकते हैं:

<form .... >
  ....other fields here....
  <input type="hidden"  name="${_csrf.parameterName}"   value="${_csrf.token}"/>
</form>

आप फॉर्म की कार्रवाई में CSRF टोकन भी शामिल कर सकते हैं:

<form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">

2
इसे उत्तर के रूप में स्वीकार किया जाना चाहिए क्योंकि यह न केवल बताता है कि क्या करना है, बल्कि इन त्रुटियों को रोकने के लिए कुछ करने से पहले आपको क्या विचार करना चाहिए।
थॉमस कार्लिसल

1
आप यह भी कर सकते हैं.csrf().ignoringAntMatchers("/h2-console/**")
insan-e

उपरोक्त उत्तर में क्वेरी पैरामीटर शैली से गुजरने से बचें। यदि आप ऐसा करते हैं तो आप सार्वजनिक रूप से टोकन उजागर कर रहे हैं।
प्रमोद एस। निकम

31

क्या आपको लॉगिन फ़ॉर्म में नहीं जोड़ा जाना चाहिए ?;

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> 

जैसा कि यहां वसंत सुरक्षा दस्तावेज में कहा गया है


12

यदि आप आवेदन करेंगे security="none"तो कोई सीएसआरएफ टोकन उत्पन्न नहीं होगा। पृष्ठ सुरक्षा फ़िल्टर से नहीं गुजरेगा। भूमिका का उपयोग करें।

मैं विवरण में नहीं गया हूं, लेकिन यह मेरे लिए काम कर रहा है।

 <http auto-config="true" use-expressions="true">
   <intercept-url pattern="/login.jsp" access="hasRole('ANONYMOUS')" />
   <!-- you configuration -->
   </http>

मैं सुरक्षा = किसी का भी उपयोग नहीं कर रहा था और आपके उत्तर पर जाने से इस समस्या का समाधान हो गया। यह बहुत बढ़िया है thymeleaf स्वतः csrf टोकन जोड़ता है। धन्यवाद !
आरएक्स



6

सीएसआरएफ को निष्क्रिय करने के लिए स्प्रिंग प्रलेखन: https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-configure

@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
      http.csrf().disable();
   }
}

कृपया मौजूदा उत्तरों की नकल न करें।
james.garriss

4

मुझे भी यहीं समस्या होती थी।

आपकी कॉन्फ़िगरेशन सुरक्षा का उपयोग करती है = "कोई नहीं" इसलिए _csrf उत्पन्न नहीं कर सकती:

<http pattern="/login.jsp" security="none"/>

आप पृष्ठ /login.jsp के लिए "IS_AUTHENTICATED_ANONYMOUSLY" का उपयोग कर सकते हैं।

<http>
    <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <intercept-url pattern="/**" access="ROLE_USER"/>
    <form-login login-page="/login.jsp"
            authentication-failure-url="/login.jsp?error=1"
            default-target-url="/index.jsp"/>
    <logout/>
    <csrf />
</http>

2

मुझे लगता है कि सीएसआरएफ केवल वसंत रूपों के साथ काम करता है

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

form:formटैग को बदलना और उसे देखना जो काम करता है।


आपको स्प्रिंग फ़ॉर्म का उपयोग करने की आवश्यकता नहीं है: docs.spring.io/spring-security/site/docs/3.2.7.RELEASE/ ...
बार्ट स्वेनहुइस

1

कृपया गितूब पर मेरा काम करने का नमूना आवेदन देखें और अपने सेट अप के साथ तुलना करें।


मैं 3.2.6 वसंत के लिए डाउनग्रेड करूंगा, मुझे उम्मीद है कि यह वसंत एमवीसी के बिना काम करता है।
ह्यूगो रोबायो

हां, यह समस्याओं के बिना काम करना चाहिए क्योंकि मैंने अपने मौजूदा एप्लिकेशन से नमूना आवेदन बनाया था जो स्प्रिंग 3.1.4 पर था।
मनीष

हा हा हा हा हा, महान है, इसे काम करने के लिए सिर्फ डाउनग्रेड करना समाधान नहीं है भैया जी @ मनीष
कुलदीप सिंह

1

न तो किसी एक समाधान ने मुझे काम दिया। केवल एक जो मेरे लिए वसंत के रूप में काम करता है वह है:

क्रिया = "./ अपलोड करें! $ {_ csrf.parameterName} = $ {_ csrf.tokee}"

के साथ बदल दिया:

कार्रवाई = "./ अपलोड करें? _csrf = $ {_ csrf.token}"

(जावा विन्यास में सक्षम सीएसआरएफ के साथ स्प्रिंग 5)


0

अपने नियंत्रक में निम्नलिखित जोड़ें:

@RequestParam(value = "_csrf", required = false) String csrf

और jsp पेज पर ऐड करें

<form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.