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

时间:2015-07-17 02:24:34

标签: php ajax codeigniter security csrf

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

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

<span
    popover-template="./mytemplate.html"
    popover-trigger="mouseenter"
    ng-bind-html="somevalue">
</span>

所以我在加载页面后第一次调用时得到了肯定的结果。但是为了尝试第二次调用,得到错误403.我还找到了为每个Ajax调用添加此代码片段的选项,但是当我的软件执行多次调用时,它变得不可行且粗鲁。

我该如何解决这个问题?也试过使用beforeSend事件,但得到了同样的错误。

3 个答案:

答案 0 :(得分:1)

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

data: {var: value, arquivo_facil_tk: $.cookie('arquivo_facil_co')}

或者如果您只是简单地序列化表单:

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

答案 1 :(得分:0)

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

在CodeIgniter控制器中:

myItems

$ data =要返回浏览器的数据

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

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

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

for(var i = 0; i < document.myForm.myItems.options.length; i++)
{
   alert(document.myForm.myItems.options[i].value);
}

另请注意,我已经$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))); 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 ); } }); 替换为您在app / config / config.php中找到的令牌名称csrf_token:token

答案 2 :(得分:0)

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

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

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