Ajax CodeIgniter 调用崩溃 - CSRF 错误 403
Ajax call crash on CodeIgniter - CSRF Error 403
我正在尝试在 CodeIgniter 中执行 Ajax 调用。正如之前已经搜索过的那样,当 CSRF 保护处于活动状态时,必须将哈希(随机生成)与每个请求一起提交给服务器。
在研究中,我发现以下代码总是通过 Ajax 请求与其他数据一起发送散列:
$.ajaxSetup({
data: {
arquivo_facil_tk: $.cookie('arquivo_facil_co')
}
});
所以我在页面加载后的第一次调用中得到了肯定的结果。但是要尝试第二次调用,会收到错误 403。我还找到了为我进行的每个 Ajax 调用添加此代码片段的选项,但是当我的软件执行多次调用时,它变得不可行且粗鲁。
我该如何解决这个问题?也尝试使用 beforeSend 事件但得到相同的错误。
与其使用 ajaxSetup
,不如将 CSRF 令牌与 data
一起包含在您实际的 AJAX 调用中,如下所示:
data: {var: value, arquivo_facil_tk: $.cookie('arquivo_facil_co')}
或者如果您只是简单地序列化表单:
data: $(this).serialize() + '&arquivo_facil_tk=' + $.cookie('arquivo_facil_co')
问题是 csrf 令牌只对一次调用有效,所以如果你想在另一个 post 请求上使用 ajax 而不刷新页面,你需要以某种方式获取新令牌无需重新加载表单。您可以在 codeigniter 控制器中通过将新令牌发送回请求脚本来执行此操作。
在您的 CodeIgniter 控制器中:
$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)));
$data = return 到浏览器的数据
$csrf = 浏览器用于下一个 ajax post 请求的新 csrf 令牌
显然你可以用其他方式输出它,但 JSON 主要用于 ajax 调用。在每个 post 响应中也以这种方式包含令牌,以用于下一个 post 请求
然后在你的下一个 ajax 请求中 (javascript):
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 );
}
});
还请记住,我csrf_token:token
将 crf_token
替换为您在 application/config/config.php 中找到的令牌名称 [=14] =]
我遇到了同样的问题。解决方案?我在整个系统中使用一个 CSRF 令牌,仅在 login/logout(和类似功能)处更改。
为了避免从同一个表单多次提交(比如双击甚至攻击),当我调用表单时,我还在事务中插入了一个随机 ID table。
当我收到此表格时,我在交易 table 中检查 ID。如果存在,则执行操作并从事务 table 中删除 ID。如果没有,则显示消息错误。
我正在尝试在 CodeIgniter 中执行 Ajax 调用。正如之前已经搜索过的那样,当 CSRF 保护处于活动状态时,必须将哈希(随机生成)与每个请求一起提交给服务器。
在研究中,我发现以下代码总是通过 Ajax 请求与其他数据一起发送散列:
$.ajaxSetup({
data: {
arquivo_facil_tk: $.cookie('arquivo_facil_co')
}
});
所以我在页面加载后的第一次调用中得到了肯定的结果。但是要尝试第二次调用,会收到错误 403。我还找到了为我进行的每个 Ajax 调用添加此代码片段的选项,但是当我的软件执行多次调用时,它变得不可行且粗鲁。
我该如何解决这个问题?也尝试使用 beforeSend 事件但得到相同的错误。
与其使用 ajaxSetup
,不如将 CSRF 令牌与 data
一起包含在您实际的 AJAX 调用中,如下所示:
data: {var: value, arquivo_facil_tk: $.cookie('arquivo_facil_co')}
或者如果您只是简单地序列化表单:
data: $(this).serialize() + '&arquivo_facil_tk=' + $.cookie('arquivo_facil_co')
问题是 csrf 令牌只对一次调用有效,所以如果你想在另一个 post 请求上使用 ajax 而不刷新页面,你需要以某种方式获取新令牌无需重新加载表单。您可以在 codeigniter 控制器中通过将新令牌发送回请求脚本来执行此操作。
在您的 CodeIgniter 控制器中:
$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)));
$data = return 到浏览器的数据
$csrf = 浏览器用于下一个 ajax post 请求的新 csrf 令牌
显然你可以用其他方式输出它,但 JSON 主要用于 ajax 调用。在每个 post 响应中也以这种方式包含令牌,以用于下一个 post 请求
然后在你的下一个 ajax 请求中 (javascript):
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 );
}
});
还请记住,我csrf_token:token
将 crf_token
替换为您在 application/config/config.php 中找到的令牌名称 [=14] =]
我遇到了同样的问题。解决方案?我在整个系统中使用一个 CSRF 令牌,仅在 login/logout(和类似功能)处更改。
为了避免从同一个表单多次提交(比如双击甚至攻击),当我调用表单时,我还在事务中插入了一个随机 ID table。
当我收到此表格时,我在交易 table 中检查 ID。如果存在,则执行操作并从事务 table 中删除 ID。如果没有,则显示消息错误。