【问题标题】:Expected CSRF token not found Spring Security未找到预期的 CSRF 令牌 Spring Security
【发布时间】:2017-05-02 15:46:37
【问题描述】:

这是场景:

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

昨天我添加了 Spring Security 标签,并且登录(和其他表单工作正常)但是一个特殊的表单停止工作。

这个表单是多部分的,因为上传了两个文件,这个表单有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 发送的。是的,我尝试将 CSRF 参数放在隐藏输入中,结果相同。

附带说明,此表单可以作为匿名用户访问

【问题讨论】:

  • 为了避免将令牌放在 URL 中,您可以将令牌添加到 HTML 标头的元标记中,然后将其添加到 XHR 请求标头中,就像我在此处描述的 stackoverflow.com/questions/21514074/…

标签: java spring spring-security csrf


【解决方案1】:

你面临的异常被抛出

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

在此处放置断点,您可以看到当前会话的预期 csrf 令牌,以及从标头或请求参数接收到的令牌。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 2019-07-20
    • 2022-11-26
    • 2016-05-24
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多