发布带有csrf令牌的表单时,$this->input->post("csrf_token")
为空。
我可以使用其他字段名称发布重复的csrf_token。但这看起来有点不必要。 是否有(另一种)方法来获得它?
__
全部使用AJAX完成。首先,必须请求令牌,并使用json模板提供,以这种方式填充:
$data["json"] = array(
"csrf_token" => $this->security->get_csrf_hash()
);
使用该令牌,完成ajax POST请求,发送用户登录名,密码。如果将?debug
添加到请求URL,并且环境不是生产,则将完整的post请求参数添加到json输出。像这样:
if( !is_null($this->input->get("debug")) && ENVIRONMENT != 'production'){
$debug = TRUE;
$data["json"]["post"] = $this->input->post();
}
我得到了:
"post": {
"un": "test",
"pw": "test"
}
添加$data["json"]["old_token"] = $this->input->post("csrf_token");
会给我"old_token": null
跨站点请求伪造,按预期工作:没有令牌,错误令牌或过期令牌会出错。因此,Codigniter确实收到了令牌。它似乎已从帖子数据中删除。
答案 0 :(得分:2)
unset($_POST[$this->_csrf_token_name]);
(第{234行csrf_verify()
中的core / Security.php)
我不会更改该行,以确保控制器在更新Codeigniter后仍然有效。