요청 매개 변수 '_csrf'또는 헤더 'X-CSRF-TOKEN'에서 유효하지 않은 CSRF 토큰 'null'이 발견되었습니다.


91

Spring Security 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'.

UPDATE 약간의 디버그 후 요청 객체는 DelegatingFilterProxy 형식으로 잘 나오지만 CoyoteAdapter의 469 행에서 request.recycle (); 모든 속성을 지우는 ...

Tomcat 6.0.36, 7.0.50에서 JDK 1.7로 테스트합니다.

이 동작을 이해하지 못했습니다. 누군가가 CSRF와 함께 작동하는 Spring Security 3.2와의 일부 애플리케이션 샘플 전쟁의 방향을 제시한다면 가능할 것입니다.


1
어떤 Spring 버전을 사용하십니까? 이 같은 일이 (차이에, 그러나 거기에 나를 위해 작동 spring-security.xml봄 4.0.0 RELEASE (GA), 봄 보안 3.2.0 RELEASE (GA) (이 스트럿츠와 통합되어 있지만 2.3.16. 나는 그것을주지 않았다 포함) Spring MVC만으로 시도하십시오). 그러나 요청이 403 상태의 파일을 업로드하기위한 다중 부분 이면 실패 합니다. 이에 대한 해결책을 찾기 위해 고군분투하고 있습니다.
Tiny

Spring 3.2.6, Spring Security 3.2.0, CSRF, 토큰이 http-request 객체에 추가되었고 세션 객체는 요청 스레드와 동일하지만 jsp가 렌더링 될 때까지 나가면 모든 속성을 제거하고 속성을 남겨 ... filter_applied
휴고 Robayo

@Tiny : 멀티 파트 문제에 대한 해결책을 찾았습니까? 나는 데 정확히 같은 문제.
Rob Johansen 2014

1
@AlienBishop : 예, 답변을 확인하십시오 (Spring과 Struts의 조합을 사용합니다). Spring MVC 만 가지고 있다면 답변을 확인하십시오 . 필터의 순서 web.xml는 매우 중요합니다. MultipartFilter전에 선언해야합니다 springSecurityFilterChain. 도움이되기를 바랍니다. 감사.
Tiny

답변:


113

Spring 애플리케이션에서 CSRF (Cross Site Request Forgery) 보호가 활성화 된 것 같습니다. 실제로 기본적으로 활성화되어 있습니다.

spring.io 에 따르면 :

CSRF 보호는 언제 사용해야합니까? 일반 사용자가 브라우저에서 처리 할 수있는 모든 요청에 ​​대해 CSRF 보호를 사용하는 것이 좋습니다. 브라우저가 아닌 클라이언트에서 사용하는 서비스 만 만드는 경우 CSRF 보호를 비활성화 할 수 있습니다.

따라서 비활성화하려면 :

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

CSRF 보호를 계속 사용하려면 양식에 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
이것은해야 할 일뿐 만 아니라 이러한 오류를 막기 위해 어떤 조치를 취하기 전에 고려해야 할 사항을 설명하기 때문에 답으로 받아 들여 져야합니다.
Thomas Carlisle

1
당신도 할 수 있습니다.csrf().ignoringAntMatchers("/h2-console/**")
insan-e

위의 답변에서 쿼리 매개 변수 스타일을 사용하지 마십시오. 이렇게하면 토큰을 공개적으로 노출하는 것입니다.
Pramod S. Nikam

32

로그인 양식에 추가해야하지 않습니까?;

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

여기 Spring 보안 문서에 명시된 바와 같이


12

신청하면 security="none"csrf 토큰이 생성되지 않습니다. 페이지는 보안 필터를 통과하지 않습니다. 역할 익명을 사용하십시오.

나는 자세히 설명하지 않았지만 그것은 나를 위해 일하고 있습니다.

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

나는 security = none을 사용하고 있었고 귀하의 답변으로 이동 하여이 문제를 해결했습니다. 그것은 굉장한 thymeleaf가 자동으로 csrf 토큰을 추가합니다. 감사 !
rxx

7

이것을 다음으로 변경 <csrf /> 하십시오 : <csrf disabled="true"/>. csfr을 비활성화해야합니다.


7

thymeleaf를 사용하면 다음을 추가 할 수 있습니다.

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


4

나는 같은 문제가 있었다.

구성은 security = "none"을 사용하므로 _csrf를 생성 할 수 없습니다.

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

/login.jsp 페이지에 대한 access = "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>


1

Github에서 내 작업 샘플 애플리케이션 을 확인 하고 설정과 비교하십시오.


나는 봄 3.2.6으로 다운 그레이드 할 것이며, 봄 mvc없이 작동하기를 바랍니다.
Hugo Robayo 2014

예, Spring 3.1.4에 있던 기존 애플리케이션에서 샘플 애플리케이션을 만들었으므로 문제없이 작동합니다.
manish

하, 하, 하, 하, 하, 좋은, 그냥 작업을 다운 그레이드하기 위해이 해결책이 아니다 bhaiya 지 @manish
Kuldeep 싱

1

솔루션 중 어느 것도 작동하지 않았습니다. Spring 양식에서 나를 위해 일한 유일한 사람은 다음과 같습니다.

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

다음으로 대체 :

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

(Java 구성에서 활성화 된 csrf가있는 Spring 5)


0

컨트롤러에서 다음을 추가하십시오.

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

그리고 jsp 페이지에서

<form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.