如果我想保护我的站点和用户免受跨站点伪造 (CSRF) 攻击,我可以$token = md5( time() * rand );
在每个具有表单的页面上生成一个唯一令牌。令牌在隐藏的输入字段中提交,echo '<input type="hidden" name="token" value="'.$token.'">';
同时存储在会话变量$_SESSION['token'] = $token;
中。
我将检查是否有任何提交的表格if($_POST['token'] == $_SESSION['token'])
并相应地进行。
但是,有些用户可能会同时执行多项任务。这是我现在实际上正在做的事情,而我正在发布这个。
在撰写我的帖子时,我打开不同的窗口/选项卡以可能研究信息或查看有关堆栈溢出的其他一些问题。堆栈溢出让我可以毫无问题地提交表单。
但是,如果我要在我的网站上这样做——这意味着在撰写帖子/表单的同时浏览其他页面——$token
每次我从我的网站上拉出不同的页面时,我都会重新生成。input
在我正在处理的表单上制作隐藏令牌并最终想要提交不正确的,因为它不再匹配$_SESSION['token']
变量,当我访问不同的页面时它已经重新生成......
有什么好的想法可以防止这个问题,或者有什么更好的解决方案来阻止 CSRF?
我想让我的用户执行多项任务并希望受到 CSRF 的保护......