在与安全表单相同的页面中生成 CSRF 令牌是否安全?
Is it safe to generate the CSRF token in a same page as the secured form?
我目前有这2个函数,一个生成token,一个校验有效性:
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 发送到此注册表单并且令牌由恶意 site/iframe 本身生成,因为会话中尚不存在,因此只需进行身份验证好吗?
假设用户因为 cookie 而保持登录状态。
我是不是理解错了?不能像 iframe 这样的远程链接在您的后端生成会话吗?
没有。据我所知,您的做法是正确的,因为只要用户进入表单页面就应该生成令牌。然后您将生成它以确保某人(真实用户)确实访问了您的表单,然后您正在为他们设置令牌。
当他们对表单执行任何操作时,您正在检查令牌以查看令牌是否对该用户有效。所以,我猜你做对了。
有一件事,生成令牌并将其存储在用户 requests/comes 到表单页面时的会话中。如果每次有请求时都生成它会更好。然后在每次成功提交表单后,从会话中清除选中的令牌。
我目前有这2个函数,一个生成token,一个校验有效性:
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 发送到此注册表单并且令牌由恶意 site/iframe 本身生成,因为会话中尚不存在,因此只需进行身份验证好吗?
假设用户因为 cookie 而保持登录状态。
我是不是理解错了?不能像 iframe 这样的远程链接在您的后端生成会话吗?
没有。据我所知,您的做法是正确的,因为只要用户进入表单页面就应该生成令牌。然后您将生成它以确保某人(真实用户)确实访问了您的表单,然后您正在为他们设置令牌。
当他们对表单执行任何操作时,您正在检查令牌以查看令牌是否对该用户有效。所以,我猜你做对了。
有一件事,生成令牌并将其存储在用户 requests/comes 到表单页面时的会话中。如果每次有请求时都生成它会更好。然后在每次成功提交表单后,从会话中清除选中的令牌。