由于 csrf 保护,XMLHttpRequest() POST 在 codeigniter 3 403(禁止)中调用
XMLHttpRequest() POST call in codeigniter 3 403 (Forbidden) due to csrf protection
我正在尝试使用普通 javascript XMLHttpRequest() 向已激活 csrf 和重新生成 的 codeigniter 控制器发出 ajax 调用。只有当我从表单中收集数据和令牌时它才有效,否则我会收到 403(禁止访问)。
这是 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() {
}
}
这是 codeigniter 中的控制器:
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);
}
}
所以我尝试在 header 中添加令牌,也在要发送的数据中,两者都不起作用 甚至从第一次调用 开始也不行。如果可能的话,我更喜欢通过在数据中包含令牌并在 header 中包含 not 来使其工作的解决方案(某些浏览器在设置 headers 时存在问题).
请 没有 jQuery 解决方案,我需要这个才能使用普通 javascript。
提前致谢。
我找到了解决方案,也许这会对某些人有所帮助,发送到控制器的数据需要以这种格式序列化:
var data = "csrf_test_name="+csrfToken;
我正在尝试使用普通 javascript XMLHttpRequest() 向已激活 csrf 和重新生成 的 codeigniter 控制器发出 ajax 调用。只有当我从表单中收集数据和令牌时它才有效,否则我会收到 403(禁止访问)。 这是 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() {
}
}
这是 codeigniter 中的控制器:
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);
}
}
所以我尝试在 header 中添加令牌,也在要发送的数据中,两者都不起作用 甚至从第一次调用 开始也不行。如果可能的话,我更喜欢通过在数据中包含令牌并在 header 中包含 not 来使其工作的解决方案(某些浏览器在设置 headers 时存在问题). 请 没有 jQuery 解决方案,我需要这个才能使用普通 javascript。 提前致谢。
我找到了解决方案,也许这会对某些人有所帮助,发送到控制器的数据需要以这种格式序列化:
var data = "csrf_test_name="+csrfToken;