由于csrf保护,代码点火器3 403中的XMLHttpRequest()POST调用(禁止)



我正试图使用纯javascript XMLHttpRequest()对已激活csrf和再生的代码点火器控制器进行ajax调用。只有当我从表单中提取数据和令牌时,它才有效,否则我会得到403(Forbidden)。这是JS:

function test_ajax() {
var ajax = new XMLHttpRequest();
var data = {'csrf_test_name':csrfToken} ;
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.open("POST", base_url+'admin/test_ajax');
ajax.setRequestHeader('X-Requested-With', 'XMLHTTPRequest');
ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;   charset=UTF-8');
ajax.setRequestHeader('csrf_test_name', csrfToken);
ajax.responseType = "json";
ajax.send(data);
function completeHandler() {
console.log(event.target.response);
}
function errorHandler() {
}
function abortHandler() {
}
}

这是代码点火器中的控制器:

class Admin extends CI_Controller{
public function __construct(){
parent::__construct();
$this->load->library('session');
$this->load->helper('url_helper');
$this->load->helper('security');
$this->load->helper('cookie');
}
public function test_ajax(){
$x = array('test1','test2');
echo json_encode($x);
//var_dump($x);
}
}

因此,我尝试在要发送的数据中添加标头中的令牌,两者都不起作用,甚至在第一次调用时也不起作用。我更喜欢一种解决方案,通过在数据中包含令牌,如果可能的话,在头中包含而不是来实现它(一些浏览器在设置头时存在问题)。请不要使用jQuery解决方案,我需要这个解决方案来使用纯javascript。提前谢谢。

我找到了解决方案,也许这会对某人有所帮助,发送到控制器的数据需要以以下格式序列化:

var data = "csrf_test_name="+csrfToken;

最新更新