【发布时间】:2016-07-14 16:46:10
【问题描述】:
我读了很多关于 CSRF Tokens 的文章,但我仍然有几个问题。
例如,我将使用 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 标头中。
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 后应该无效?
你能解释一下我什么时候可以使用每个会话的令牌和每个请求的令牌吗?在哪些情况下? 在我的示例中,为什么令牌在此过期时间后仍然有效?
【问题讨论】:
-
我相信是因为您将 regenerate 设置为 TRUE?
-
重新生成 TRUE 在每个请求上更新 CSRF 令牌。
标签: php ajax codeigniter csrf