CSRF令牌和Codeigniter 3

pod7payv  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(140)

我读了很多关于CSRF代币的书,但我仍然有一些问题。
例如,我将演示我的情况与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 CI配置为

$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后应该是无效的?
你能解释一下什么时候我可以使用令牌每个会话和令牌每个请求?在哪些情况下?在我的例子中,为什么令牌仍然有效后,这个到期时间?

n7taea2i

n7taea2i1#

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

相关问题