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 后继续运行。