繁体   English   中英

CSRF 令牌和 Codeigniter 3

[英]CSRF Tokens and Codeigniter 3

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

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

我有登录表单并向 /ajax/login 发出 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 后应该无效?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM