CI:当 $config['csrf_protection'] = TRUE 时,为什么我所有的 jqxhr 请求都会失败?
CI: Why do all my jqxhr requests fail when $config['csrf_protection'] = TRUE?
在通过我的 CI 3.1.11 代码清理它(由 XAMPP v2.3.4 本地主机托管)时,我似乎做了一些事情来阻止服务器接受任何 jqxhr 请求如果我有 CI 的跨站请求伪造 (csrf) 保护 运行ning。
我正在使用其他 http 请求从服务器和外部文件获取信息,例如 <head>
中加载 jquery 的行、我的 css 文件等。这些工作无论 csrf 设置的状态如何都可以。
当我设置:
$config['csrf_protection'] = TRUE;
我的 jqxhr 请求总是出现 http 403 错误(被拒绝的请求意味着可疑的黑客企图)。我的基本问题是了解为什么会发生这种情况,以便我可以更正它和 运行 csrf 保护。
我不知道这是否相关,但我发现我只需要向 jqxhr 提供控制器和功能,而不是完整的 url。我在网上看到的大多数示例都提供了嵌入式 Php 代码以在前面插入 base_url。系统中的某些东西(CI?)似乎无论如何都想在 base_url 前面加上 controller/function。如果我自己插入它,它会创建一个无法使用的 url,base_url 出现两次。
如果我使用 . . .
var url= "C_library/updateTitle";
$.post(url, { 'tID':tID, 'newTitle':newTitle }, function(data) { . .
。 . .如果 csrf 不是 运行ning,请求有效。如果 csrf 保护是 运行ning,这将是一个典型的控制台错误报告:
XHRPOSThttp://localhost/MZlocal/C_library/updateTitle [HTTP/1.1 403 Forbidden 32ms]
请注意 url 的格式正确。
此外,可能不相关,但这是我的 .htaccess 文件 - 有效(从地址栏中删除 "index.php")。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/ [L]
csrf 保护是 CI 的一项重要功能,我真的很想更好地了解它。任何关于我应该看哪里的帮助或提示都将不胜感激。
完整的 csrf config.php:
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();
In your Form data you must pass security token when CSRF is TRUE
<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" />
csrf-protection 的整个想法是让您的 CI 框架生成一个令牌,并在每次提交表单或 ajax 请求时发送到服务器,以确保请求是通过你的网页。无论您是提交普通表格还是执行 ajax 请求,都必须将令牌与您的请求一起发送。如果您执行 ajax 请求 ,则需要执行 2 个步骤。
1) 确保源代码中提供了令牌 通过使用 CodeIgniter 表单助手(自动为您生成令牌)或实现隐藏输入字段(比如@Boominathan Elango 已经发布)
<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" />
您可以通过许多不同的方式提供令牌值,但我想这对您来说没问题。
2) 然后你必须 发送令牌连同你的 ajax 请求:
在您的 Javascript 代码中:
// first get the token value from your hidden input field:
var csrfTokenValue = $('input[name=csrf_test_name]').val();
// You Ajax url - check if this here is the right one for you
var ajaxUrl = 'http://localhost/MZlocal/C_library/updateTitle';
$.ajax({
type: "POST",
url: ajaxUrl,
data: {
'csrf_test_name' : csrfTokenValue,
'tID': tID,
'newTitle':newTitle
},
success: success,
dataType: dataType
});
假设您的配置仍然像发布的 > csrf_test_name 作为令牌名称。
也许你需要稍微改变一下你的 javascript (根据你想用你的 ajax 请求发送的数据),但一般来说它应该像那样工作。捕获错误等等..
在通过我的 CI 3.1.11 代码清理它(由 XAMPP v2.3.4 本地主机托管)时,我似乎做了一些事情来阻止服务器接受任何 jqxhr 请求如果我有 CI 的跨站请求伪造 (csrf) 保护 运行ning。
我正在使用其他 http 请求从服务器和外部文件获取信息,例如 <head>
中加载 jquery 的行、我的 css 文件等。这些工作无论 csrf 设置的状态如何都可以。
当我设置:
$config['csrf_protection'] = TRUE;
我的 jqxhr 请求总是出现 http 403 错误(被拒绝的请求意味着可疑的黑客企图)。我的基本问题是了解为什么会发生这种情况,以便我可以更正它和 运行 csrf 保护。
我不知道这是否相关,但我发现我只需要向 jqxhr 提供控制器和功能,而不是完整的 url。我在网上看到的大多数示例都提供了嵌入式 Php 代码以在前面插入 base_url。系统中的某些东西(CI?)似乎无论如何都想在 base_url 前面加上 controller/function。如果我自己插入它,它会创建一个无法使用的 url,base_url 出现两次。
如果我使用 . . .
var url= "C_library/updateTitle";
$.post(url, { 'tID':tID, 'newTitle':newTitle }, function(data) { . .
。 . .如果 csrf 不是 运行ning,请求有效。如果 csrf 保护是 运行ning,这将是一个典型的控制台错误报告:
XHRPOSThttp://localhost/MZlocal/C_library/updateTitle [HTTP/1.1 403 Forbidden 32ms]
请注意 url 的格式正确。
此外,可能不相关,但这是我的 .htaccess 文件 - 有效(从地址栏中删除 "index.php")。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/ [L]
csrf 保护是 CI 的一项重要功能,我真的很想更好地了解它。任何关于我应该看哪里的帮助或提示都将不胜感激。
完整的 csrf config.php:
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();
In your Form data you must pass security token when CSRF is TRUE
<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" />
csrf-protection 的整个想法是让您的 CI 框架生成一个令牌,并在每次提交表单或 ajax 请求时发送到服务器,以确保请求是通过你的网页。无论您是提交普通表格还是执行 ajax 请求,都必须将令牌与您的请求一起发送。如果您执行 ajax 请求 ,则需要执行 2 个步骤。
1) 确保源代码中提供了令牌 通过使用 CodeIgniter 表单助手(自动为您生成令牌)或实现隐藏输入字段(比如@Boominathan Elango 已经发布)
<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" />
您可以通过许多不同的方式提供令牌值,但我想这对您来说没问题。
2) 然后你必须 发送令牌连同你的 ajax 请求:
在您的 Javascript 代码中:
// first get the token value from your hidden input field:
var csrfTokenValue = $('input[name=csrf_test_name]').val();
// You Ajax url - check if this here is the right one for you
var ajaxUrl = 'http://localhost/MZlocal/C_library/updateTitle';
$.ajax({
type: "POST",
url: ajaxUrl,
data: {
'csrf_test_name' : csrfTokenValue,
'tID': tID,
'newTitle':newTitle
},
success: success,
dataType: dataType
});
假设您的配置仍然像发布的 > csrf_test_name 作为令牌名称。 也许你需要稍微改变一下你的 javascript (根据你想用你的 ajax 请求发送的数据),但一般来说它应该像那样工作。捕获错误等等..