CSRF令牌和Codeigniter 3

时间:2016-03-27 08:02:55

标签: php ajax codeigniter csrf

我为CSRF代币阅读了很多,但我仍然没有多少问题。

例如,我将使用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标头中。

好的令牌发送没有问题,我的&#34;如果&#34;声明是

$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秒之后,如果我重复相同的请求,我会再次看到&#34; OK&#34;。令牌仍然有效,但在csrf到期时间3600后应该无效?

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

1 个答案:

答案 0 :(得分:0)

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