在与安全表单相同的页面中生成 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 到表单页面时的会话中。如果每次有请求时都生成它会更好。然后在每次成功提交表单后,从会话中清除选中的令牌。