我阅读了很多关于CSRF令牌的内容,但我仍然有几个问题。
例如,我将使用codeigniter 3演示我的情况。
我有登录表单并向/ ajax /login发出ajax请求
在发送此请求之前,我有一个带有生成的csrf令牌的meta标签
<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请求,token将被添加到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配置是
$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之后应该无效吗?
你能给我解释一下什么时候可以使用每个会话的令牌和每个请求的令牌吗?在哪些情况下?在我的示例中,为什么令牌在此过期时间后仍然有效?
发布于 2020-02-05 13:39:58
我的解决方案是,当用户离开表单超过令牌过期时间并为每个请求启用CSRF时,在请求失败时在AJAX成功中发出GET请求,因为令牌已经过期。然后有一个用最新令牌继续更新的隐藏字段,如果在发出请求时它已经过期,则发出GET请求以获取最新令牌,然后在提交表单的函数上调用单击事件,这意味着该函数必须传递"this“或ID作为部分parameter.This使用户无法在后台实现更新令牌的过程
https://stackoverflow.com/questions/36245169
复制相似问题