Ajax CSRF 403 forbidden codeigniter

5

你好,我正在使用 AJAX 调用控制器来获取部分内容,我的应用程序基于 CodeIgniter,启用了 CSRF 保护。

我的 AJAX 代码:

    $('#classes').change(function(){  
  $classes=$(this).val();
            $.ajax({
             type:"POST",
             data:{
                 '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>',
                 'class':$classes
             },
             url:"<?php echo base_url();?>index.php/admin/getsection/"+$classes,
             success:function(return_data)
             {
                //alert(return_data);
                $('#section').html('');
                $('#section').html(return_data);
                $('#section').val(section);
             }
    });
当我第一次调用ajax函数时,它会完美运行。但是当我再次运行相同的函数时,它会返回403禁止错误。请建议我该怎么做。
2个回答

11

来自文档

令牌可以在每次提交时重新生成(默认)或在CSRF cookie的生命周期内保持相同。默认情况下,令牌的重新生成提供了更严格的安全性,但可能会导致可用性问题,因为其他令牌变得无效(后退/前进导航,多个选项卡/窗口,异步操作等)。您可以通过编辑以下配置参数来更改此行为:

$config['csrf_regenerate'] = TRUE;
将其设置为FALSE。

0
ur controller should be like this 

 function reply(){       
        $insert = $this->Message_model->send_message2();
        $csrf = $this->security->get_csrf_hash();
if($this->input->is_ajax_request())
{
   header("Content-type: application/json; charset=utf-8");
echo json_encode(array("data" => $insert,'csrf'=> $csrf)); 
}




ur jquery should be this way

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 );
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,