Codeigniter CSRF仅对ajax请求有效一次

我想在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 : "", type: 'post', data: {'security->get_csrf_token_name(); ?>':'security->get_csrf_hash(); ?>',"id":"hello","link":link}, success : function(data) { alert(data); } }); }); 

在我看来,你应该尝试每个请求重新创建你的csrf令牌

试试这个代码示例……

对于js funcion

 var csrfName = 'security->get_csrf_token_name(); ?>', csrfHash = 'security->get_csrf_hash(); ?>'; ("#avatar").change(function(){ var link = $("#avatar").val(); $.ajax({ url : "", type: 'post', data: {csrfName:csrfHash,"id":"hello","link":link}, 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); } 

让我知道,祝你好运

注意:当有人要求您在问题中发布更多数据时,不要将其作为评论或答案发布,最好编辑问题本身并添加内容

您可以在config.php中设置它

 $config['csrf_regenerate'] = FALSE; 

因此csrf保护在所有会话时间内都有效,它将解决您的问题。 如果设置$config['csrf_regenerate'] = true; 然后CI会在每个请求中生成新的csrf令牌,因此旧的csrf令牌与新生成的csrf令牌不匹配

您需要做的就是在AJAX响应中重新加载SCRF令牌。 就这么简单!

编辑配置:

 $config['csrf_exclude_uris'] = ['controller/method']; 

arrays可以包括您希望禁用csrf保护的所有白名单控制器/方法。

该数组还可以处理正则表达式,例如:

 $config['csrf_exclude_uris'] = array( 'api/record/[0-9]+', 'api/title/[az]+' ); 

有关更多信息,请访问Codeigniter文档 – 安全类

在每个页面加载的js文件中添加它(我把它放在jquery.js的末尾)

  $.ajaxSetup({ beforeSend:function(jqXHR, Obj){ var value = "; " + document.cookie; var parts = value.split("; csrf_cookie_name="); if(parts.length == 2) Obj.data += '&csrf_token='+parts.pop().split(";").shift(); } }); 

(请注意,在每个ajax请求中,您都不能发送空数据)

在config.php中定义的顶部的“csrf_cookie_name”

 $config['csrf_cookie_name'] = 'csrf_cookie_name';