我目前有这两个函数,一个用于生成令牌,另一个用于检查有效性:
function getToken() {
if(isset($_SESSION['token'])) {
return $_SESSION['token'];
} else {
$token = //random key generator goes here;
$_SESSION['token'] = $token;
return $token;
}
}
function validateToken($token) {
if ($token == getToken()){
return true;
} else {
return false;
}
}
我的注册表包含了这个隐藏的输入:
<input type="hidden" name="token" value="<?php echo getToken(); ?>">
这样安全吗?我问,因为如果合法用户的会话到期,然后他们得到CSRF到这个注册表单,并且令牌由恶意网站/ iframe本身生成,因为会话中已经存在,因此认证很好吗?
假设用户因cookie而保持登录状态。
我在这里错误地理解了什么吗?像iframe这样的远程链接是否可以在后端生成会话?
答案 0 :(得分:0)
没有。据我所知,你正在以正确的方式正确行事,因为一旦用户进入表单页面就应该生成令牌。然后,您将生成它以确定某人(真实用户)确实访问过您的表单,然后您为他们设置了令牌。
当他们对表单执行任何操作时,您正在检查令牌以查看该令牌是否对该用户有效。所以,我猜你做得对。
有一件事,当用户请求/来到表单页面时,生成令牌并将其存储在会话中。如果每次请求时都生成它会更好。然后在每次成功提交表单后,从会话中清除已检查的令牌。