"_Csrf" istek parametresinde veya "X-CSRF-TOKEN" başlığında geçersiz CSRF Simgesi "boş" bulundu


91

Spring Security 3.2'yi yapılandırdıktan sonra, _csrf.tokenbir isteğe veya oturum nesnesine bağlı değildir.

Bu, bahar güvenlik yapılandırmasıdır:

<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 dosyası

<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>

Ve sonraki html'yi oluşturur:

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

Sonuç, 403 HTTP durumudur:

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

GÜNCELLEME Bir miktar hata ayıklamadan sonra, istek nesnesi DelegatingFilterProxy formundan çıkar, ancak CoyoteAdapter 469 satırında request.recycle (); tüm öznitelikleri silen ...

Tomcat 6.0.36, 7.0.50'de JDK 1.7 ile test ediyorum.

Bu davranışı anlamadım, bunun yerine, birisi beni CSRF ile çalışan Spring Security 3.2 ile bazı uygulama örneği savaşına yönlendirirse mümkün olabilirdi.


1
Hangi Bahar sürümünü kullanıyorsunuz? Aynı şey benim için de geçerli (ancak farklılıklar var spring-security.xml) Spring 4.0.0 RELEASE (GA), Spring Security 3.2.0 RELEASE (GA) (Struts 2.3.16 ile entegre olmasına rağmen) ile. yalnızca Spring MVC ile deneyin). Ancak istek, 403 durumundaki dosyaların yüklenmesi için çok parçalı olduğunda başarısız olur . Bunun için bir çözüm bulmakta zorlanıyorum.
Küçük

Spring 3.2.6, Spring Security 3.2.0, CSRF, belirteç http-istek nesnesine eklendi, oturum nesnesi istek iş parçacığı ile aynıdır, ancak jsp oluşturana kadar dışarı çıktığında tüm öznitelikleri kaldırır ve yalnızca bir öznitelik bırakın ... filter_applied
Hugo Robayo

@Tiny: Çok parçalı soruna hiç çözüm buldunuz mu? Ben yaşıyorum tam aynı sorunu.
Rob Johansen

1
@AlienBishop: Evet, lütfen bu yanıtı kontrol edin (Yay ve Desteklerin bir kombinasyonunu kullanır). O zaman yalnızca Spring MVC'niz varsa, lütfen bu yanıtı kontrol edin . Filtrelerin sırasının web.xmlçok önemli olduğu unutulmamalıdır . MultipartFilterdaha önce beyan edilmelidir springSecurityFilterChain. Umarım yardımcı olur. Teşekkürler.
Küçük

Yanıtlar:


113

Spring uygulamanızda CSRF (Siteler Arası İstek Sahteciliği) korumasının etkin olduğu görülüyor. Aslında varsayılan olarak etkindir.

Spring.io'ya göre :

CSRF korumasını ne zaman kullanmalısınız? Tavsiyemiz, normal kullanıcılar tarafından bir tarayıcı tarafından işlenebilecek herhangi bir istek için CSRF korumasını kullanmaktır. Yalnızca tarayıcı olmayan istemciler tarafından kullanılan bir hizmet oluşturuyorsanız, muhtemelen CSRF korumasını devre dışı bırakmak isteyeceksiniz.

Yani devre dışı bırakmak için:

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

CSRF korumasını etkin durumda tutmak istiyorsanız, formunuza csrftoken. Bunu şu şekilde yapabilirsiniz:

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

CSRF belirtecini formun eylemine bile dahil edebilirsiniz:

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

2
Bu cevap olarak kabul edilmelidir çünkü sadece ne yapmanız gerektiğini değil, aynı zamanda bu hataları durdurmak için bir şeyler yapmadan önce nelere dikkat etmeniz gerektiğini de açıklar.
Thomas Carlisle

1
Ayrıca yapabilirsiniz.csrf().ignoringAntMatchers("/h2-console/**")
insan-e

Yukarıdaki yanıtta, sorgu parametresi stilini kullanmaktan kaçının. Bunu yaparsanız, jetonları halka açık hale getirmiş olursunuz.
Pramod S. Nikam

32

Giriş formuna eklemeniz gerekmez mi ?;

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

Belirtildiği gibi burada Bahar güvenlik belgelerinde


12

Eğer geçerli olur security="none"o zaman hiçbir csrf belirteç oluşturulur. Sayfa güvenlik filtresinden geçmeyecektir. ANONYMOUS rolünü kullanın.

Ayrıntılara girmedim ama benim için çalışıyor.

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

Ben security = none kullanıyordum ve cevabınıza geçmek bu sorunu çözdü. bu harika thymeleaf otomatik olarak csrf belirtecini ekler. Teşekkürler !
rxx

7

Bu değiştirmeye çalışın <csrf /> buna: <csrf disabled="true"/>. Csfr'yi devre dışı bırakmalıdır.


7

Thymeleaf ile şunları ekleyebilirsiniz:

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


4

Ben de aynı sorunu yaşıyordum.

Yapılandırmanız güvenlik = "yok" kullandığından _csrf oluşturamaz:

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

/login.jsp sayfası için access = "IS_AUTHENTICATED_ANONYMOUSLY" ayarını yukarıdaki yapılandırmanın yerine koyabilirsiniz :

<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>


1

Lütfen Github'daki çalışma örnek uygulamama bakın ve kurulumunuzla karşılaştırın.


Yay 3.2.6'ya düşüreceğim, umarım yaylı mvc olmadan çalışır.
Hugo Robayo

Evet, Spring 3.1.4'teki mevcut uygulamamdan örnek uygulamayı oluşturduğum için sorunsuz çalışmalı.
manish

ha ha ha ha ha, harika, sadece sürüm düşürmek çözüm değil bhaiya ji @manish
Singh

1

Çözümlerden hiçbiri benden işe yaramadı. Bahar formunda benim için çalışan tek kişi:

action = "./ upload? $ {_ csrf.parameterName} = $ {_ csrf.token}"

ŞULE DEĞİŞTİRİLDİ:

action = "./ upload? _csrf = $ {_ csrf.token}"

(Java yapılandırmasında etkin csrf ile Spring 5)


0

Denetleyicinize aşağıdakileri ekleyin:

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

Ve jsp sayfasında ekle

<form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.