首页 文章

CSRF令牌与多个选项卡冲突

提问于
浏览
17

我在我的应用程序中构建了 CSRF 保护,只需在 every 页面加载时生成随机令牌,将其置于会话中,然后将令牌绑定到 <body> 标记属性,如:

<body data-csrf-token="csrf_GeJf53caJD6Q5WzwAzfy">

然后在每个表单操作或ajax请求中,我只需从body标签中获取令牌并将其发送出去 .

除了一个巨大的问题,这很好用 . 用户正在打开应用程序的多个选项卡,我看到令牌冲突 . 例如,用户加载第一页并生成令牌,然后他们切换选项卡,加载另一页,生成新令牌 . 最后,他们切换回第一页并提交格式化操作 . 这会导致无效的CSRF令牌错误 .

重新构建此选项以防止与多个选项卡发生冲突的最佳方法是什么,同时尽可能保证其安全 .

只是在登录时生成 single token 正确的解决方案,而不是在每个页面加载时生成新的令牌?

2 回答

  • 15

    假设您的应用程序使用SSL加以保护,那么通过在每个页面加载时生成新标记实际上没有创建任何值 . 它不会阻止攻击者利用XSS漏洞 - 他们无论如何都可以访问新生成的令牌 .

    记住CSRF令牌防范的内容:恶意的第三方页面盲目地尝试将数据发布到您的应用程序,希望用户登录 . 在这种攻击中,攻击者永远无法访问CSRF令牌,因此更改它经常没有好处 .

    不要浪费时间和资源来跟踪每个会话的多个令牌 . 只需在开始时生成一个并完成 .

  • 2

    您可以在登录时使用单个令牌 . 正如@ Josh3736指出的那样,这很好用 .

    如果您确实希望每页有一个令牌,则可以在$ _SESSION中存储一组有效令牌 . 然后,您将在使用它们时使单个令牌到期 . 您也可以选择在超时期限后使它们过期,但只有在超时短于会话超时时才有意义 . 但是,再次,你真正完成了什么?对于CSRF而言,单个令牌完全正常 .

相关问题