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

如何在PHP/JavaScript应用程序中处理CSRF令牌?,javascript,php,ajax,token,csrf,Javascript,Php,Ajax,Token,Csrf,我正在编写一个PHP/JavaScript应用程序。在某些页面加载中,会发出AJAX请求以获取数据以填充页面。这些AJAX请求使用令牌来防止CSRF,并存储在PHP会话中 当发出请求时,会检查令牌,如果令牌有效,则会将其删除。因此,我的设置是用PHP生成一个令牌,应用于HTML body标记,然后使用JS获取并存储在一个变量中。我只生成一个令牌,因此相同的令牌用于表单。因此,我现在面临的一个难题是,如果一个页面有一个表单并在加载时触发AJAX请求,那么一旦通过AJAX请求检查并认为令牌是有效的,

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

当发出请求时,会检查令牌,如果令牌有效,则会将其删除。因此,我的设置是用PHP生成一个令牌,应用于HTML body标记,然后使用JS获取并存储在一个变量中。我只生成一个令牌,因此相同的令牌用于表单。因此,我现在面临的一个难题是,如果一个页面有一个表单并在加载时触发AJAX请求,那么一旦通过AJAX请求检查并认为令牌是有效的,令牌就会被删除。因此表单将无法提交,因为它使用的令牌不再有效。我正在寻求一个合适和合理的解决方案

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

所以我的问题是,我的两个解决方案听起来是一个很好的解决方案,还是有更好的方法来处理我的令牌验证问题?我的应用程序是否会暴露在任何安全缺陷之下

干杯

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

这个-

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


只要您的令牌对用户会话是唯一的、不可预测的,并且每次登录时都会刷新,即使在“记住我”创建了新的活动会话之后,您也可以继续使用。

许多应用程序使用的令牌每小时左右过期一次。需要更多帮助吗?如果是这样,我会更新我的答案。