Web令牌管理


Web tokens management

我在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请求,该脚本将延长令牌在数据库中的生存期。