未找到预期的CSRF令牌Spring Security

时间:2016-12-16 19:33:03

标签: java spring spring-security csrf

这是情景:

我使用的是Spring Security 4.0.1,它默认启用了CSRF,一切正常,直到昨天。

昨天我添加了Spring Security Tags,登录(以及其他表单工作正常)但是一个特殊的表单停止了工作。

此表单是多部分,因为上传了两个文件,此表单具有CSRF参数但服务器正在返回:

  

HTTP状态403 - 未找到预期的CSRF令牌。你的会议   过期?

这基本上是以下形式:

<form id="documentForm" class="card-panel" method="POST" enctype="multipart/form-data" action="<c:url value="/documents/signDocument?${_csrf.parameterName}=${_csrf.token}"/>">
  <input type="file" name="document"/>
  <input type="text" name="signer"/>
 </form>

当然这是表单的完全截止版本,但请注意CSRF参数是通过操作URL发送的。是的,我尝试将CS​​RF参数放在隐藏的输入中,结果相同。

在旁注中,此表单可以匿名用户身份访问

1 个答案:

答案 0 :(得分:0)

您所面临的例外情况被抛入

org.springframework.security.web.csrf.CsrfFilter#doFilterInternal

在那里放置一个断点,您可以看到当前会话的预期csrf标记,以及从标头或请求参数接收的标记。

如果找不到正确的会话,或者会话cookie错误,也可能发生此错误,因此您可能还需要检查该错误。