【问题标题】:Codeigniter CSRF protection with datatables ajax urlCodeigniter CSRF 保护与数据表 ajax url
【发布时间】:2016-12-01 05:59:11
【问题描述】:

我正在使用 codeigniter,我们已启用 CSRF 保护,

$config['csrf_protection'] = TRUE;

我们使用过:

`<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>">` 

在表单提交及其工作正常中,

但我的应用程序也使用 DataTables 通过 AJAX 获取服务器数据,

var handleDataTable = function () {
    var table = $('#my_table').DataTable({
      "ajax": {
          "url" : baseURL + "user/core/data/"+report_id,
          "dataType" : "json",
          "type" : "POST", // ajax source
        },
    });
}

显然这将显示“The action you have requested is not allowed.”消息,

如何在 Ajax 检索数据中传递 csrf?

【问题讨论】:

    标签: javascript jquery ajax codeigniter


    【解决方案1】:

    在您的 Ajax 函数中将其作为标题传递:

    var handleDataTable = function () {
    
        var table = $('#my_table').DataTable({
          "ajax": {
              "url" : baseURL + "user/core/data/"+report_id,
              "dataType" : "json",
              "type" : "POST", // ajax source
              "headers": {
                'CSRFToken': TOKEN //replace by your name/value
              }
            },
    });
    

    如果您有很多 Ajax 请求,您应该为所有请求设置一个全局标头:

    $.ajaxSetup( {
        headers: {
            'CSRFToken': TOKEN  //replace by your name/value
        }
    });
    

    或将名称/值对作为数据的一部分发送:

    $('#myTable').DataTable( {
        ajax: {
            url: '...',
            data: function ( d ) {
                d.csrfName = csrfValue;
            }
        }
    } );
    

    Source

    【讨论】:

    • 感谢您的信息,我已经在 AJAX 中添加了这个,但我不确定 CodeIgniter 是否会同时查找令牌名称和哈希?如果是的话,我必须需要传递两个值作为令牌,我怎么能?
    • 我现在得到了解决方案,实际上 config 和 js 中的令牌名称不同,现在相同并解决了问题,谢谢,
    猜你喜欢
    • 2012-02-03
    • 2017-06-14
    • 2023-03-08
    • 1970-01-01
    • 2013-09-20
    • 2011-10-23
    • 2017-10-21
    • 2017-05-28
    • 2011-10-15
    相关资源
    最近更新 更多