CSRF代币和代码生成器3

问题描述 投票:2回答:1

我读了很多关于CSRF令牌的书,但是我仍然有几个问题。

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

我有登录表单,并向/ ajax / login

在发送此请求之前,我具有带有生成的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秒之后,如果我重复相同的请求,我将再次看到“确定”。令牌仍然有效,但在csrf到期时间3600之后应该无效吗?

您能解释一下我何时可以在每个会话中使用令牌以及在每个请求中使用令牌吗?在什么情况下?在我的示例中,为什么令牌在此到期时间之后仍然有效?

php ajax codeigniter csrf
1个回答
0
投票

当用户为每个请求启用CSRF的情况下离开表单一段时间后,为我工作的解决方案是,由于令牌已过期而导致请求失败时,在AJAX成功中发出GET请求。然后有一个隐藏字段,该字段将继续使用最新令牌更新,如果在发出请求时令牌已过期,则您进行GET REQUEST来获取最新令牌,然后在提交表单的函数上引发click事件,这意味着该函数必须传递了“ this”或ID作为部分参数。这使用户无法在后台实现更新令牌的过程

© www.soinside.com 2019 - 2024. All rights reserved.