Codeigniter csrf 令牌不在 post 数组中
Codeigniter csrf token not in post array
当 post 使用 csrf 令牌创建表单时,$this->input->post("csrf_token")
为空。
我可以 post 使用另一个字段名称重复 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 确实收到了令牌。它似乎已从 post 数据中删除。
经过一番摸索,我找到了答案。安全性 class 从 POST 数组中删除令牌:unset($_POST[$this->_csrf_token_name]);
(core/Security。php 在 csrf_verify()
的第 234 行)
我不会更改该行,以确保控制器在更新 Codeigniter 后继续运行。
当 post 使用 csrf 令牌创建表单时,$this->input->post("csrf_token")
为空。
我可以 post 使用另一个字段名称重复 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 确实收到了令牌。它似乎已从 post 数据中删除。
经过一番摸索,我找到了答案。安全性 class 从 POST 数组中删除令牌:unset($_POST[$this->_csrf_token_name]);
(core/Security。php 在 csrf_verify()
的第 234 行)
我不会更改该行,以确保控制器在更新 Codeigniter 后继续运行。