我在PHP建设网站。我在每个form
标签上添加token
字段,以防止CSRF攻击。
在每个页面我创建一个随机字符串并将其存储在会话中。
$_SESSION['form1_token'] = hash('sha512', uniqid(null, true));
HTML: <form ...>
<input type="hidden" value="<?php echo $_SESSION['form1_token']; ?>" />
....
</form>
然后检查服务器端的值,并从会话中删除令牌。
它工作得很好,但是如果用户导航到另一个页面而不发送表单,我该怎么办?该令牌将永远不会被删除。
时间限制是不好的,因为我的网页应该运行很长一段时间,需要刷新可能会令人讨厌。所以我想在unload
事件中发送请求来删除会话。但是用户只要有一点网络知识,就可以用每一个浏览器来删除事件。
如何正确管理令牌?
使用时间限制。设定一个较长的时间(比如一天)。如果页面被设计为在那里停留的时间超过这个时间,那么在计时器上向脚本发送一个Ajax请求,该脚本将延长令牌在数据库中的生存期。