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';
- jQuery jsonrpc 2.0通过.ajax()调用得到正确的响应,但不起作用?
- 有没有办法让JQuery ajax成功函数访问它所包含的对象?
- AJAX POST请求失败到同一页面(带示例)
- 是否可以使用Bootstrap的modal dialog,jQuery,AJAX和PHP将图像上传到服务器? 如果有,怎么样? 如果没有什么原因呢?
- 如何在Ajax刷新后绑定jQuery Datepicker?
- 从jquery通过AJAX发送图像数据
- Ajax在Javascript中产生错误的输出
- jQuery使用AJAX加载Google Visualization API
- bootstrap 3动态模态 – ajax内容缓存问题