【发布时间】: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