首页 > 解决方案 > CI:当 $config['csrf_protection'] = TRUE 时,为什么我所有的 jqxhr 请求都失败了?

问题描述

在通过我的 CI 3.1.11 代码来清理它(由 XAMPP v2.3.4 localhost 托管)时,如果我有 CI 的跨站点请求伪造(csrf)保护,我似乎已经做了一些事情来阻止服务器接受任何 jqxhr 请求跑步。

我正在使用其他 http 请求从服务器和外部文件获取信息,例如<head>加载 jquery 中的行、我的 css 文件等。无论 csrf 设置的状态如何,这些都可以正常工作。

当我设置时: $config['csrf_protection'] = TRUE;我的 jqxhr 请求总是得到 http 403 错误(被拒绝的请求意味着可疑的黑客攻击)。我的基本问题是了解为什么会发生这种情况,以便我可以纠正它并运行 csrf 保护。

我不知道这是否相关,但我发现我只需要向 jqxhr 提供控制器和功能,而不是完整的 url。我在网上看到的大多数示例都提供了嵌入的 PHP 代码来在前面插入 base_url。无论如何,系统中的某些东西(CI?)似乎都希望将 base_url 添加到控制器/函数中。如果我自己插入它,它会创建一个不可用的 url,其中 base_url 出现两次。

如果我使用 . . . var url= "C_library/updateTitle"; $.post(url, { 'tID':tID, 'newTitle':newTitle }, function(data) { . .

. . . 如果 csrf 未运行,则该请求有效。如果 csrf 保护正在运行,这将是一个典型的控制台错误报告:

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?/$1 [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();

标签: phpjqueryajaxhttpcodeigniter-3

解决方案


在您的表单数据中,当 CSRF 为 TRUE 时,您必须传递安全令牌

<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" />

推荐阅读