web-dev-qa-db-ja.com

無効なCSRFトークン「null」がリクエストパラメータ「_csrf」またはヘッダー「X-CSRF-TOKEN」で見つかりました

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とのアプリケーションサンプル戦争の方向性を誰かが教えてくれるのではなく、この動作を理解していません。

84
Hugo Robayo

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">
91
MaVRoSCy

ログインフォームに追加すべきではありませんか?;

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

Springセキュリティドキュメントの here に記載されているとおり

28
borjab

security="none"を適用する場合、csrfトークンは生成されません。ページはセキュリティフィルターを通過しません。ロールANONYMOUSを使用します。

私は詳細には行っていませんが、それは私のために働いています。

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

これを変更してみてください:<csrf />からこれに<csrf disabled="true"/>。 csfrを無効にする必要があります。

7
Arkadiusz Gibes

Csrfを無効にするSpringドキュメント: 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();
   }
}
6
Rahul Raj

Thymeleafでは、次を追加できます。

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

以前は同じ問題を抱えていました。

設定では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>
4
xxg

私はcsrfがスプリングフォームでのみ動作すると思います

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

form:formタグに変更し、動作することを確認します。

2
Saurabh Kumar

私の動作するサンプルアプリケーション Githubで を参照し、セットアップと比較してください。

1
manish

どちらのソリューションも機能しませんでした。私がSpring形式で働いていた唯一のものは次のとおりです。

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

交換された:

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

(Java構成でcsrfを有効にした春5)

1
vancho

コントローラーに以下を追加します。

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

そして、jspページに追加します

<form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}
0
Taras Melnyk