在与安全表单相同的页面中生成 CSRF 令牌是否安全


Is it safe to generate the CSRF token in a same page as the secured form?

我目前有这两个函数,一个用于生成令牌,一个用于检查有效性:

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 这样的远程链接不能在您的后端生成会话吗?

No.据我所知,您的做法是正确的,因为令牌应该在用户进入表单页面后立即生成。然后,您将生成它以确保某人(真实用户)实际上访问了您的表单,然后您正在为他们设置令牌。

当他们对表单执行任何操作时,您将使用令牌进行检查,以查看令牌是否对该用户有效。所以,我想你做对了。

一件事,生成令牌并在用户请求/进入表单页面时将其存储在会话中。最好在每次请求来时生成它。然后,在每次成功提交表单后,从会话中清除选中的令牌。