您请求的操作不允许出错

时间:2012-04-30 12:10:52

标签: codeigniter pyrocms

我创建了一个名为Gallery的模块,它在我的localhost版本2.0.3上正常工作,但是当在远程站点上使用版本2.1.0时,我无法提交表单,我收到错误:

  

不允许您请求的操作。

为什么会这样?

11 个答案:

答案 0 :(得分:24)

我同意@Jhourlad Estrella修复问题而不是禁用安全功能,但是我觉得真正的问题在于隐藏输入字段以保存令牌。

使用form_open()form_close()辅助函数,而不是使用纯HTML来创建表单元素。原因是当你使用帮助函数时,它会自动将csrf标记作为隐藏字段插入表单中。

您也可以通过将表单添加为表单

中的隐藏输入字段来手动执行此操作
<input type="hidden" name="csrf_hash_name" value="your-hash-value-here">

这样做可以让您免受CSRF攻击,并解决您遇到的问题。

希望这可以帮助其他人,因为这让我第一次搞清楚了。

答案 1 :(得分:14)

这是与CSRF保护相关的Codeigniter错误。您可以在cms/config/config.php

中取消它

答案 2 :(得分: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 :(得分:2)

我有一个在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保护,但保留所有其他请求的完整性。

答案 4 :(得分:1)

这是一个老问题,但同样的问题确实花了我很多时间,我想分享问题在我的情况下。它可能对某人有帮助。

我正在使用Codeigniter 3.0.6和CommunityAuth 3,我在登录后收到此错误。

这是令人困惑的,因为问题有时会发生,而其他时候也不会发生。

我的&#39; base_url&#39;在CI的config.php设置为类似于&#39; www.mysite.com&#39;

当您使用&#39; mysite.com&#39;浏览网站时(通知&#39; www&#39;不在地址中)并且您使用CI&#39; base_url&#39;进行表单提交。设置,就像CommunityAuth的登录一样,然后CSRF检查失败并且您得到“不允许您请求的操作。”#39;错误。

答案 5 :(得分:1)

当$ _COOKIE中的CSRF令牌与$ _POST [&#39; csrf_token_name&#39;]匹配时,system/core/Security.php中的函数csrf_show_error()抛出此错误。

config.php内,我必须确保$config['cookie_domain']匹配$config['base_url'],而不是协议(即http(s)://)。

否则,cookie没有通过,这意味着无法进行匹配。

答案 6 :(得分:1)

我找到了使用表单助手函数

实施例

<?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();?>

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

答案 7 :(得分:0)

使用codeigniter表单开启器,如下所示:

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

请参阅codeigniter表单文档了解更多信息。

答案 8 :(得分:0)

这可能是一种罕见的情况,但我没有看到我的问题,因为我的服务器有许多不同的域名非常相似。问题是我登陆了一个完全错误的域名,但是因为&#34;你所要求的行动是不允许的。&#34;错误优先于&#34; 404 Not Found Error&#34;我无法看到它。我的问题是我没有将base_url更改为正确的域名。因此,如果上述解决方案都不适合您,您可以在application / config中检查$ config [&#39; base_url&#39;]的设置。

答案 9 :(得分:0)

我使用Codeigniter 3与

相同的问题
  

不允许您请求的操作。

基于Isaac Pak的观点,我将base_url更改为我在地址栏中输入的内容。像这样...

而不是放

  

Then your script $('.menu').click(function(){ $('#css-menu').toggleClass('shown hidden'); });

我是这样写的..

  

http://www.domain.org

因为我的http://domain.org只是..

  

base_url()

修复程序适用于我的网站...

答案 10 :(得分: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');
}