Codeigniter csrf令牌不在post数组中

时间:2015-11-09 10:56:46

标签: codeigniter http-post csrf codeigniter-3

发布带有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确实收到了令牌。它似乎已从帖子数据中删除。

1 个答案:

答案 0 :(得分:2)

经过一番探索之后,我找到了答案。安全性类从POST数组中删除令牌:unset($_POST[$this->_csrf_token_name]);(第{234行csrf_verify()中的core / Security.php)

我不会更改该行,以确保控制器在更新Codeigniter后仍然有效。