当前位置: 首页 > 面试题库 >

Codeigniter CSRF仅在一次Ajax请求中有效

曾飞雨
2023-03-14
问题内容

我想在jQuery的更改事件上在服务器上上传图像,但是使用codeigniter
csrf我只能上传一次图像。如何使用Ajax上传图像以进行多个请求。设置此功能时请注意

config['csrf_protection'] = FALSE;

那么我能够发送多个请求jQuery
onchange事件,但是当csrf_protection将为false时,我认为csrf没有任何优势。所以问题是启用csrf_protection时如何使用ajax发送多个请求。我的jQuery代码如下

$("#avatar").change(function(){
    var link = $("#avatar").val();     
    $.ajax({
        url : "<?php echo base_url('main/test'); ?>",
        type: 'post',
        data: {'<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>',"id":"hello","link":link},            
        success : function(data)
        {   
            alert(data);
        }  
    });
});

问题答案:

我认为您应该尝试重新创建每个请求的csrf令牌

试试这个代码示例…

对于js函数

var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>',
    csrfHash = '<?php echo $this->security->get_csrf_hash(); ?>';
("#avatar").change(function(){
    var link = $("#avatar").val();

    var dataJson = { [csrfName]: csrfHash, id: "hello", link: link };

    $.ajax({
        url : "<?php echo base_url('main/test'); ?>",
        type: 'post',
        data: dataJson,            
        success : function(data)
        {   
            csrfName = data.csrfName;
            csrfHash = data.csrfHash;
            alert(data.message);
        }  
    });
});

对于控制器

public function test() { 
    $config['upload_path'] = './uploads/'; 
    $config['allowed_types'] = 'gif|jpg|png'; 
    $config['max_size'] = 500; 
    $config['max_width'] = 260; 
    $config['max_height'] = 260;

    $reponse = array(
                'csrfName' => $this->security->get_csrf_token_name(),
                'csrfHash' => $this->security->get_csrf_hash()
                )

    $this->load->library('upload', $config); 
    if (!$this->upload->do_upload('link')) { 
        $reponse['message'] = "error"; 
    } 
    else { 
        $data = array('upload_data' => $this->upload->data()); 
        $image_name = $data['upload_data']['file_name']; 
        $reponse['message'] = $image_name; 
    }

    echo json_encode($reponse);
}

让我知道,祝你好运

注意: 当有人要求您向问题发布更多数据时,请勿将其发布为评论或答案,最好自己编辑问题并添加内容



 类似资料:
  • 问题内容: 我使用自己的自定义AJAX库(我对使用jQuery等不感兴趣),该库在以下浏览器中可以正常工作: Firefox 7 铬14 IE 8 IE 8(兼容模式) 在上述浏览器中使用我的自定义AJAX库,我可以使用GET和/或POST方法以任意顺序发出任意数量的AJAX请求,并且它们都可以正常工作。由于为每个请求都创建了一个新的AJAX对象(请参见下面的代码),因此我什至可以成功地同时完成多

  • 问题内容: 我有这段代码,但是当有人在我的网站上时,值可能会更改。我需要每30秒左右更新#finance div。能做到吗? 问题答案: 您可以将代码放在这样的单独函数中: 然后设置一个计时器,每30秒调用一次该函数: 祝好运!;)

  • 问题内容: 我有一个ajax调用到一个php文件。我正在收到结果。现在,我正在研究是否有可能使ajax请求每1秒自动执行一次。我将结果发布到名为的输入字段中。如何每三秒钟执行一次ajax调用而不必调用该函数? 问题答案: 您可能要考虑的是服务器发送事件(SSE) 这是一种HTML5技术,JavaScript可以通过该技术“ 长期轮询 ”服务器端点(您的PHP文件)以查看是否发生了任何更改。长轮询基

  • 问题内容: 我刚刚开始使用nodejs。我想知道是否有一种方法只能在应用程序中“一次”请求文件。我正在使用一个类框架来在我的JS项目中获取经典的OOPS。每个“类”都包含在其自己的JS文件中。我想“要求”每个文件中的类框架,以便它们可以独立运行,但希望框架的初始化代码仅执行一次。 我可以使用一个标志来自己实现,但是内置的方法会很好。搜索“ require一次”使我想到所有与PHP有关的问题。 问题

  • 问题内容: 我想每次发送ajax请求时显示一个“正在加载”进度栏。是否有可能在任何时候使用jQuery发送ajax请求时收到通知? 问题答案: 您可以使用该方法来设置将应用于整个页面的全局AJAX属性:

  • 问题内容: 我正在学习AngularJS,并尝试构建从Wordpress获取数据的前端系统。 在后端,一切似乎都已正确设置,当我使用jQuery ajax请求时,它可以毫无问题地获取数据。 但是,当我尝试使用AngularJS做同样的事情时,它不起作用。我正在尝试使用以下代码复制ajax请求: 如果我将其记录下来,它将输出0。我缺少什么? 谢谢你的帮助。 PS控制器如下所示: 问题答案: 在ang