Php CodeIgniter上的Ajax调用崩溃-CSRF错误403

Php CodeIgniter上的Ajax调用崩溃-CSRF错误403,php,ajax,codeigniter,security,csrf,Php,Ajax,Codeigniter,Security,Csrf,我试图在CodeIgniter中执行Ajax调用。如前所述,当CSRF保护处于活动状态时,每个请求都必须向服务器提交一个散列(随机生成) 在研究中,我发现以下代码总是通过Ajax请求与其他数据一起发送: $.ajaxSetup({ data: { arquivo_facil_tk: $.cookie('arquivo_facil_co') } }); 所以我在页面加载后的第一次调用中得到了一个肯定的结果。但要尝试第二次调用,请获取错误403。我还发现了为我所做的

我试图在CodeIgniter中执行Ajax调用。如前所述,当CSRF保护处于活动状态时,每个请求都必须向服务器提交一个散列(随机生成)

在研究中,我发现以下代码总是通过Ajax请求与其他数据一起发送:

$.ajaxSetup({
    data: {
        arquivo_facil_tk: $.cookie('arquivo_facil_co')
    }
});
所以我在页面加载后的第一次调用中得到了一个肯定的结果。但要尝试第二次调用,请获取错误403。我还发现了为我所做的每个Ajax调用添加此代码段的选项,但是由于我的软件执行了几个调用,这变得不可行和粗鲁


我怎样才能解决这个问题?还尝试使用beforeSend事件,但得到了相同的错误。

而不是使用
ajaxSetup
只需在实际的AJAX调用中包含CSRF令牌和
数据,如下所示:

data: {var: value, arquivo_facil_tk: $.cookie('arquivo_facil_co')}
或者,如果您只是在序列化表单:

data: $(this).serialize() + '&arquivo_facil_tk=' + $.cookie('arquivo_facil_co')

问题是csrf令牌只对一个调用有效,因此如果您想在另一个post请求上使用ajax而不刷新页面,则需要在不重新加载表单的情况下以某种方式获取新令牌。通过将新令牌发送回请求脚本,可以在codeigniter控制器中执行此操作

在CodeIgniter控制器中:

$data = array('data'=> 'data to send back to browser');
$csrf =  $this->security->get_csrf_hash();
$this->output
    ->set_content_type('application/json')
    ->set_output(json_encode(array('data' => $data, 'csrf' => $csrf)));
$data=要返回到浏览器的数据

$csrf=浏览器用于下一个ajax post请求的新csrf令牌

显然,您可以用其他方式输出,但JSON主要用于ajax调用。还可以在每个post响应中以这种方式包含令牌,以用于下一个post请求

然后在下一个ajax请求(javascript)中:


还请记住,我在哪里得到了
csrf_令牌:令牌
crf_令牌
替换为在application/config/config.php中找到的令牌的名称,该行声明
$config['csrf_令牌(name')='csrf_令牌'

我也遇到了同样的问题。解决方案是什么?我在整个系统中使用一个CSRF令牌,仅在登录/注销时更改(以及类似的功能)

为了避免来自同一表单的多次提交(比如双击,甚至攻击),当我调用表单时,我还会在事务表中插入一个随机ID


当我收到此表单时,我会在事务表中检查ID。如果存在,则执行操作并从事务表中删除ID。如果没有,则显示消息错误。

好的,很好。但我在应用程序的生命周期内以及在几个不同的函数中进行了多次调用。我没有办法把这些数据作为所有通话的标准数据?
var token = data.csrf;

$.ajax({
    url: '/next/ajax/request/url',
    type: 'POST',
    data: { new_data: 'new data to send via post', csrf_token:token },
    cache: false,
    success: function(data, textStatus, jqXHR) {
        // Get new csrf token for next ajax post
        var new_csrf_token = data.csrf     
       //Do something with data returned from post request
    },
    error: function(jqXHR, textStatus, errorThrown) {
      // Handle errors here
      console.log('ERRORS: ' + textStatus + ' - ' + errorThrown );
    }
});