我正在尝试开发一个表单助手来防止表单欺骗。所以我想出了这个:
<form...>
<?=form::secure()?>
...
</form>
它使用一个令牌标记一个隐藏的表单,该表单带有一个令牌,该令牌是用户会话 id 的 md5(它是随机的,并在 1 周后更新)。然后在“动作”网址(来自表单):
$token = (isset($_GET['_token'])) ? $_GET['_token'] : null;
$token = (is_null($token) and isset($_POST['_token'])) ? $_POST['_token'] : $token;
if (form::is_secure($token)) { // checks if the given token is equal to md5(user id)
...ok...
} else {
...error...
}
这是否可以防止表单欺骗或我遗漏了什么?如果用户 id 在用户刚刚加载页面然后提交其表单的确切时刻过期,它只会打印一个错误,他应该再次提交表单,但这是可以接受的(很少见)。
我认为这里唯一可能出错的是,如果潜在的攻击者能够获取用户会话 ID,然后他可以将 ?_token=id 附加到它的请求并将其提供给用户进行浏览,但那时,如果攻击者拥有用户会话 ID,它无论如何都可以为所欲为。
我对吗?如果没有,我该如何编辑我的代码来实现我的目标?