由于csrf保护,XMLHttpRequest()在codeigniter 3 403(禁止)中进行POST调用

时间:2016-12-31 07:52:44

标签: javascript ajax xmlhttprequest csrf codeigniter-3

我正在尝试使用普通的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);
}
}

因此,我尝试在要发送的数据中也在标题中添加令牌,在第一次调用时,均无效。我希望有一个解决方案,通过在数据中包含令牌并在可能的情况下在标题中包含 not 来使其工作(某些浏览器有设置标题的问题)。 请没有jQuery 解决方案,我需要使用普通的javascript工作。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

var data = "csrf_test_name="+csrfToken;