我读了很多关于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后应该是无效的?
你能解释一下什么时候我可以使用令牌每个会话和令牌每个请求?在哪些情况下?在我的例子中,为什么令牌仍然有效后,这个到期时间?
1条答案
按热度按时间n7taea2i1#
当用户离开表单超过令牌过期时间一段时间,并为每个请求启用CSRF时,对我有效的解决方案是,当请求由于令牌过期而失败时,在 AJAX Success中发出GET请求。然后有一个隐藏字段,继续更新最新的令牌,如果在提出请求时,它已经过期,你提出一个GET REQUEST来获取最新的令牌,然后调用函数上的点击事件提交表单,这意味着函数必须传递“this”或ID作为部分参数,这使得用户无法在后台实现令牌更新过程