如何在PHP / JavaScript应用程序中处理CSRF令牌?

时间:2015-02-15 20:20:45

标签: javascript php ajax token csrf

我正在编写一个PHP / JavaScript应用程序。在某些页面加载时,会发出AJAX请求以获取填充页面的数据。这些AJAX请求使用令牌来阻止CSRF,并存储在PHP会话中。

在发出请求时会检查令牌,如果它们有效,则会被删除。所以我的设置是在PHP中生成的令牌,应用于HTML body标签,然后使用JS获取并存储在变量中。我只生成一个令牌,因此表单使用相同的令牌。因此,我现在面临的一个困境是,如果页面有一个表单并在加载时激发AJAX请求,则一旦经过AJAX请求检查并认为该令牌有效,该令牌就会被删除。因此,表单将失败提交,因为其使用的令牌不再有效。我正在寻找一个合适而明智的解决方案。

我有两个想法;首先,我只是为AJAX请求使用一个单独的令牌,这意味着我有两个专用于令牌的会话。或者第二,我可以在我的令牌类中添加一些额外的逻辑,这些逻辑不会删除AJAX请求上的令牌,因此它仍然有效。第二个选项也允许使用相同令牌的多个AJAX请求,因此我可以使用相同的令牌执行无限滚动之类的操作。但是,我不确定第二种解决方案是否非常安全或合理。

所以我的问题是,我的两个解决方案中的任何一个听起来都是一个好的解决方案,还是有更好的方法来处理我的令牌验证问题?我的应用程序是否会暴露于任何安全漏洞?

干杯

1 个答案:

答案 0 :(得分:0)

  

我可以在我的令牌类中添加一些额外的逻辑,这些逻辑不会删除AJAX请求上的令牌,因此它仍然有效。第二个选项也允许使用相同令牌的多个AJAX请求,因此我可以使用相同的令牌执行无限滚动之类的操作。但是,我不确定第二种解决方案是否非常安全或合理。

这一个 - there is no need to refresh the token every time

没有安全优势,因为CSRF令牌无论如何都应该是秘密的,攻击者无法读取(如果你有更大的问题)。

只要您的令牌对于用户会话是唯一的,每次登录时都会发生不可预测和刷新(即使在"记住我"已经创建了新的活动会话之后),那么您就是好的去。