每个请求的 Csrf 令牌 [关闭]
Posted
技术标签:
【中文标题】每个请求的 Csrf 令牌 [关闭]【英文标题】:Csrf token for each request [closed] 【发布时间】:2014-01-06 20:37:54 【问题描述】:任何人都可以帮助如何为每个请求生成 csrf 令牌以及如何验证它。
【问题讨论】:
【参考方案1】:一般来说,您必须从表单模板中getToken
以在表单中包含隐藏的输入,然后在接收 Servlet 中确保您收到 POST 请求和 isValid
。
如何在您的应用中始终如一地绑定它取决于您使用的框架代码。如果您所说的“Action Class”指的是 Struts 2,那么该框架已经有自己的 CSRF 机制 TokenSessionInterceptor
,通常您希望重用它。
现在要求是针对每个请求
如果您的意思是有人要求在每次页面加载时更改 CSRF 令牌,您应该反对该请求,因为它是虚假的。
“CSRF 令牌不会在每个请求上都失效”是渗透测试报告中常见的填充发现,但修复它会使您的应用程序的可用性大大降低。如果您的旧令牌在每个新页面上都失效,那么您将无法同时在两个选项卡中使用不同的页面,或者导航回一个页面然后提交表单。
当您应该使 CSRF 令牌无效(并发布一个新令牌)时,您同时也使您的会话无效:在任何特权级别更改上。最明显的是,当用户成功登录时,您应该丢弃旧会话和其中的旧 CSRF 令牌,并用新令牌替换它们以防止会话固定攻击。
但更进一步会牺牲可用性,而不会获得安全性。
【讨论】:
是的,这一切似乎都符合预期。小问题:(a) 记住要确保您正在检查isValid
的 servlet 只接受 POST(因为您不想在可能泄漏的 URL 中允许令牌); (b) 通常,您应该始终对您放入 JSP 中的 html 页面的所有文本值进行 HTML 转义,并引用属性值(即使在这种特殊情况下,它不易受到 HTML 注入的影响——当您总是转义时,管理起来会容易得多始终如一); (c) 在生产中,您需要将敏感令牌的日志记录删除到标准输出。以上是关于每个请求的 Csrf 令牌 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Cakephp 3 的 ajax 调用中定义 CSRF 令牌。此外,对于某些 ajax 请求,如何关闭 CSRF