【问题标题】:XMLHttpRequest() POST call in codeigniter 3 403 (Forbidden) due to csrf protection由于 csrf 保护,在 codeigniter 3 403(禁止)中的 XMLHttpRequest() POST 调用
【发布时间】:2017-05-15 08:41:25
【问题描述】:

我正在尝试使用普通的 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。 提前致谢。

【问题讨论】:

    标签: javascript ajax xmlhttprequest csrf codeigniter-3


    【解决方案1】:

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

    var data = "csrf_test_name="+csrfToken;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2017-06-14
      相关资源
      最近更新 更多