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

时间:2016-07-07 03:25:14

标签: php session token csrf csrf-protection

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

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这样的远程链接是否可以在后端生成会话?

1 个答案:

答案 0 :(得分:0)

没有。据我所知,你正在以正确的方式正确行事,因为一旦用户进入表单页面就应该生成令牌。然后,您将生成它以确定某人(真实用户)确实访问过您的表单,然后您为他们设置了令牌。

当他们对表单执行任何操作时,您正在检查令牌以查看该令牌是否对该用户有效。所以,我猜你做得对。

有一件事,当用户请求/来到表单页面时,生成令牌并将其存储在会话中。如果每次请求时都生成它会更好。然后在每次成功提交表单后,从会话中清除已检查的令牌。