您所请求的操作不允许错误

10

我制作了一个名为“Gallery”的模块,在本地版本2.0.3上运行良好,但在远程站点上使用版本2.1.0时,无法提交表单并显示以下错误:

您请求的操作是不允许的。

这是为什么?

11个回答

25

我同意@Jhourlad Estrella关于解决问题而不是禁用安全功能的想法,但我认为真正的问题在于保存令牌的隐藏输入字段。

使用form_open()form_close()帮助函数而非纯HTML创建表单元素。原因是当你使用帮助函数时,它会自动将CSRF令牌作为隐藏字段插入到表单中。

你也可以手动添加令牌作为表单中的隐藏输入字段。

<input type="hidden" name="csrf_hash_name" value="your-hash-value-here">

按照这种方式操作可以保护你免受CSRF攻击,并解决你遇到的问题。

希望这对其他人有所帮助,因为第一次弄明白这个问题时让我很沮丧。


1
@AaronBruce 嗯,不幸的是我一年后才回答这个问题。但希望它能够得到足够的关注。 - JoeMoe1984
4
еҰӮжһңжӮЁж— жі•дҪҝз”Ё form_open() жҲ– form_close()пјҢжӮЁеҸҜд»ҘдҪҝз”Ё $this->security->get_csrf_hash(); е’Ң $this->security->get_csrf_token_name(); иҺ·еҸ–CSRFд»ӨзүҢзҡ„еҗҚз§°е’ҢеҖјгҖӮиҜ·жіЁж„ҸпјҢзҝ»иҜ‘еҗҺзҡ„ж–Үжң¬е·Із»Ҹж¶ҰиүІе№¶жӣҙеҠ йҖҡдҝ—жҳ“жҮӮпјҢдҪҶдҝқз•ҷдәҶеҺҹе§Ӣж„ҸжҖқпјҢ并且没жңүд»»дҪ•йўқеӨ–зҡ„и§ЈйҮҠжҲ–дҝЎжҒҜиҝ”еӣһгҖӮ - Joel Kinzel

15

这是一个与CSRF保护相关的Codeigniter错误。 你可以在cms/config/config.php中取消它。


12
关闭CSRF保护当然意味着你变得容易受到CSRF攻击。 - Highly Irregular
谢谢,这对我很有帮助,我正在尝试使用Plupload和Codeigniter通过AJAX请求上传文件。 - Lix
8
我同意HighlyIrregular的观点,这并没有真正解决问题,只是绕开了它并使OP容易受到CSRF攻击。JoeMoe1984和Jhourlad Estrella提供的答案更好。我们不应该鼓励不太安全的编码/开发实践。 - Joel Kinzel
显然,安全性是必须的,因此不建议禁用CSRF。当我们在CI中启用CSRF时,在每个表单中它都会添加类似于这样的内容<input type="hidden" name="csrf_token" value="4ac7a11a8239660afaa87cb48f2694e2" style="display:none;" />但是当我们使用<form> .... </form>时,上述错误会发生,因为CI在使用<form> .... </form>时不会添加该隐藏输入,并且当我们在启用CSRF的情况下提交表单而没有CSRF令牌时,它会给出上述错误。你所要做的就是使用<?php echo form_open();?><?php echo form_close();?> - mapmalith

3

在编程方面,你不能绕过问题,你必须解决它。我的意思是,如果这个功能无法使用,那么它就不会存在:因为它对我来说是可用的并且有效。你只是在实现上遇到了问题。

我的回答:从application/config/config.php中以下条目的值中删除所有破折号、句号和任何其他非字母数字字符,如下所示:

$config['sess_cookie_name'] = 'mycookiename'; //instead of "my_cookie_name"
$config['csrf_token_name']  = 'mycsrftoken';  //instead of "my.csrf.token"
$config['csrf_cookie_name'] = 'mycsrfcookie'; //instead of "my/csrf/cookie"

顺便说一下,破折号有时可以使用,但我建议尽可能使用单词来命名配置值。除非您有时间和技能来研究与您正在处理的内容相关的Codeigniter核心文件,以确保这样做是安全的。

无论如何,我希望这能帮助到某个人,即使我的答案已经晚了一年以上。


3

我有一个表单,是在CI之外(在Joomla中)构建的,但我想用CI来处理它。我的解决方法是选择性地禁用特定引用程序的csrf。我将此添加到配置中,直接放在csrf的默认配置选项后面:

/* Set csrf off for specific referrers */
$csrf_off = array(
    "http://yourdomain.com/your-form-url",
    "http://yourdomain.com/some-other-url"
);

if (isset($_SERVER["HTTP_REFERER"])) {
    if (in_array($_SERVER["HTTP_REFERER"],$csrf_off)) {
        $config['csrf_protection'] = false;
    }
}

这将为 $csrf_off 数组中的特定 URL 禁用 CSRF 保护,但会保持对所有其他请求的完整保护。


1
我知道这种方法有点老,但它确实帮助我解决了在启用csrf时使用CKEDITOR的问题。谢谢。 - Mike C

2
我发现使用表单帮助函数非常方便。
示例:
<?php echo form_open('controller/function');?>

<?php echo form_input('username', 'Username');?>

<?php echo form_close();?>

使用上述辅助函数应该可以避免显示CSRF错误消息。
如果我不使用echo form_input(),而是放置普通输入框,重新加载时会触发CSRF错误。
<?php echo form_open('controller/function');?>

<input type="text" name="username" />

<?php echo form_close();?>

因此,我建议现在使用所有表单助手函数。

1
这个错误由system/core/Security.php中的csrf_show_error()函数抛出,当$_COOKIE中的CSRF令牌与您的$_POST['csrf_token_name']不匹配时。
config.php中,我必须确保$config['cookie_domain']$config['base_url']匹配,不包括协议(即http(s)://)。
否则,cookie不会被传递,这意味着无法进行匹配。

1
这是一个老问题,但在我的情况下,这个问题花费了我很多时间,所以我想分享一下问题。我正在使用Codeigniter 3.0.6和CommunityAuth 3,并且在登录后遇到了这个错误。由于问题有时会发生,有时不会发生,因此非常令人困惑。CI的config.php中的'base_url'设置为类似'www.mysite.com'的东西。当您使用'mysite.com'(注意地址中没有'www')浏览站点并进行使用CI的'base_url'设置(如CommunityAuth的登录)的表单提交时,CSRF检查失败,您将收到'The action you have requested is not allowed.'错误。

我认为解决这个问题的好方法是选择一个“首选”地址 - 带有“www”或不带 - 并使用htaccess将所有流量重定向到该首选地址。除了解决这个问题外,它还可以防止搜索引擎将www和非www内容分别索引,这可能会损害搜索引擎排名。我的重写如下所示: ## 将www流量重写到根域名 RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://%1/$1 [R=302,L] (FYI-我似乎无法在此处使用换行符-抱歉如此松散) - cmpreshn

0
对我来说问题是我在索引中加载视图,然后我改成如下的方式就可以正常工作了:
public function index()
{
    // Load Login Page
    redirect('login/login_page','refresh');

}

public function login_page()
{
    $data['title'] = 'Login Page';

    $this->load->view('templates/header', $data);
    $this->load->view('users/login_view', $data);
    $this->load->view('templates/footer');
}

0

使用CodeIgniter表单打开器的方法如下:

<php echo form_open(url,method,attributes);?>

请参阅 CodeIgniter 表单文档以获取更多信息。

0
这可能是一个罕见的情况,但由于我的服务器有许多非常相似的不同域名,我没有看到我的问题。问题在于我降落在完全错误的域上,但由于“您请求的操作不允许。”错误优先于“404未找到错误”,所以我看不到它。我的问题是我没有将base_url更改为正确的域。因此,如果以上解决方案都不适用于您,您可以检查application/config中$config['base_url']的设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接