【问题标题】:Is it safe to generate the CSRF token in a same page as the secured form?在与安全表单相同的页面中生成 CSRF 令牌是否安全?
【发布时间】:2016-11-09 06:41:14
【问题描述】:

我目前有这两个功能,一个是生成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,并且令牌由恶意站点/iframe 本身生成,因为会话中尚不存在令牌,因此验证就好了?

假设用户因为 cookie 而保持登录状态。

我在这里理解错了吗?像 iframe 这样的远程链接不能在您的后端生成会话吗?

【问题讨论】:

  • 而且...会话比这更不安全,因为...?
  • @Machavity 抱歉,无法理解您要说的内容。我要问的是我的方法是否安全,因为我认为在与表单相同的页面中生成令牌有点违背目的,不是吗?
  • "在与表单相同的页面中生成令牌" --- 这是什么意思? CSRF 令牌必须是无法猜测的。这是对它的唯一要求。

标签: php session token csrf csrf-protection


【解决方案1】:

没有。据我所知,您这样做是正确的,因为应在用户进入表单页面后立即生成令牌。然后您将生成它以确保有人(真实用户)确实访问过您的表单,然后您正在为他们设置令牌。

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

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

【讨论】:

  • "如果每次请求都生成就更好了。" --- 这肯定会很痛苦,但从安全角度来看,尚不清楚为什么它应该“更好”。
  • 这将有助于防止会话劫持,因为会话将在更短的时间内存储令牌。
  • 如果你偷了一个会话 - 它与 CSRF 有什么关系?您有一个会话 ID - 您转到该页面并使用刚刚生成的令牌执行请求。
  • 我就是这么说的。
  • 嗯,不是。关键是您的建议不仅维护起来很痛苦,而且从安全角度来看也没有任何好处。一种常见的错觉是,重新生成/清除 CSRF 令牌会改变任何东西,而实际上并没有。
猜你喜欢
  • 2015-08-17
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 2010-09-13
  • 1970-01-01
  • 2013-09-20
相关资源
最近更新 更多