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ñ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とのアプリケーションサンプル戦争の方向性を誰かが教えてくれるのではなく、この動作を理解していません。
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">
ログインフォームに追加すべきではありませんか?;
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
Springセキュリティドキュメントの here に記載されているとおり
security="none"
を適用する場合、csrfトークンは生成されません。ページはセキュリティフィルターを通過しません。ロールANONYMOUSを使用します。
私は詳細には行っていませんが、それは私のために働いています。
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login.jsp" access="hasRole('ANONYMOUS')" />
<!-- you configuration -->
</http>
これを変更してみてください:<csrf />
からこれに<csrf disabled="true"/>
。 csfrを無効にする必要があります。
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();
}
}
Thymeleafでは、次を追加できます。
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
以前は同じ問題を抱えていました。
設定では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>
私はcsrfがスプリングフォームでのみ動作すると思います
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
form:form
タグに変更し、動作することを確認します。
私の動作するサンプルアプリケーション Githubで を参照し、セットアップと比較してください。
どちらのソリューションも機能しませんでした。私がSpring形式で働いていた唯一のものは次のとおりです。
action = "./ upload?$ {_ csrf.parameterName}= $ {_ csrf.token}"
交換された:
action = "./ upload?_ csrf= $ {_ csrf.token}"
(Java構成でcsrfを有効にした春5)
コントローラーに以下を追加します。
@RequestParam(value = "_csrf", required = false) String csrf
そして、jspページに追加します
<form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}