CSRF令牌和代码点火器3


CSRF Tokens and Codeigniter 3

我读了很多关于CSRF代币的文章,但我仍然有一些问题。

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

我有登录表单,并向/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后应该无效吗?

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

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