【问题标题】:CSRF Tokens and Codeigniter 3CSRF 令牌和 Codeigniter 3
【发布时间】:2016-07-14 16:46:10
【问题描述】:

我读了很多关于 CSRF Tokens 的文章,但我仍然有几个问题。

例如,我将使用 codeigniter 3 演示我的情况。

我有登录表单并发出 ajax 请求 /ajax/登录

在发送此请求之前,我有带有生成的 csrf 令牌的元标记

<meta name="csrf-token" content="<?= $this->security->get_csrf_hash(); ?>">

还有

$.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN':  $('meta[name="csrf-token"]').attr('content')
                }
            });

            $.ajax({
              url: ".../ajax/login",
              context: document.body
            }).done(function() {

            });

现在对于我的 ajax 请求,令牌将添加到 x-csrf-token 标头中。

OK 令牌发送没有问题,我的“if”语句是

$csrf_ajax = $this->input->get_request_header('X-CSRF-Token', TRUE);
$csrf_cookie = $this->security->get_csrf_hash();

if($csrf_ajax == $csrf_cookie){
    echo "OK";
}else{
    echo 'NOT OK';
}

我的 CSRF 配置是

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_protection';
$config['csrf_cookie_name'] = 'csrf';
$config['csrf_expire'] = 3600;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();

在这 3600 秒之后,如果我重复相同的请求,我将再次看到“OK”。令牌仍然有效,但在 csrf 过期时间 3600 后应该无效?

你能解释一下我什么时候可以使用每个会话的令牌和每个请求的令牌吗?在哪些情况下? 在我的示例中,为什么令牌在此过期时间后仍然有效?

【问题讨论】:

  • 我相信是因为您将 regenerate 设置为 TRUE?
  • 重新生成 TRUE 在每个请求上更新 CSRF 令牌。

标签: php ajax codeigniter csrf


【解决方案1】:

当用户离开表单超过令牌过期时间并为每个请求启用 CSRF 时,对我有用的解决方案是在请求失败时在 AJAX Success 中发出 GET 请求,因为令牌已过期。然后有一个隐藏字段继续使用最新令牌更新,如果在发出请求时它已过期,您发出 GET REQUEST 以获取最新令牌,然后在提交表单的函数上调用 click 事件,这意味着该函数必须是将“this”或ID作为部分参数传递。这使得用户无法在后台实现更新令牌的过程

【讨论】:

    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2011-07-19
    • 2021-05-14
    • 2013-09-18
    • 2016-04-25
    • 2016-02-10
    相关资源
    最近更新 更多