【问题标题】:Action you have requested is not allowed error您请求的操作是不允许的错误
【发布时间】:2012-05-10 03:22:51
【问题描述】:

我制作了一个名为 Gallery 的模块,该模块在我的本地主机上运行良好,版本为 2.0.3,但是在远程站点上使用版本 2.1.0 时,我无法提交表单并且出现错误:

您请求的操作不被允许。

这是为什么?

【问题讨论】:

    标签: codeigniter pyrocms


    【解决方案1】:

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

    【讨论】:

    • 当然,关闭 CSRF 保护意味着您将面临 CSRF 攻击。
    • 谢谢,它帮助我解决了尝试使用 AJAX 请求、Plupload 和 Codeigniter 上传文件的问题。
    • 我同意高度不规则这并不能真正解决问题,它可以解决它并使 OP 容易受到 CSRF 攻击。 JoeMoe1984 和 Jhourlad Estrella 有更好的答案。我们不应该鼓励不太安全的编码/开发实践。
    • 显然安全是必须的,所以不建议禁用 CSRF。当我们在 CI 中启用 CSRF 时,它在每种形式中都会添加类似 <input type="hidden" name="csrf_token" value="4ac7a11a8239660afaa87cb48f2694e2" style="display:none;" /> 的内容,但是当我们使用 <form> .... </form> 时会发生上述错误,因为当我们使用 <form> .... </form> 时,CI 不会添加隐藏的输入。在启用 CSRF 时提交没有 CSRF 令牌的表单会给出上述错误。您所要做的就是使用<?php echo form_open();?><?php echo form_close();?>
    【解决方案2】:

    在编程问题上,您不是解决问题,而是解决问题。我的意思是,如果它不可用,这个功能就不会在这里:'因为它是并且它对我有用。你只是在实现上有问题。

    我的回答:从 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】:

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

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

      您也可以手动执行此操作,方法是将令牌添加为表单中的隐藏输入字段

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

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

      希望这对其他人有所帮助,因为这让我第一次弄清楚这一点时发疯了。

      【讨论】:

      • @AaronBruce 是的,不幸的是,我迟到了一年才回答这个问题,哈哈。但希望它会引起足够的注意。
      • 如果你不能使用form_open()form_close()你可以使用$this-&gt;security-&gt;get_csrf_hash();$this-&gt;security-&gt;get_csrf_token_name();获取CSRF令牌名称和值
      【解决方案4】:

      我有一个在 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 保护,但对于所有其他请求保持不变。

      【讨论】:

      • 我知道它已经过时了,但是这种方法确实帮助我解决了在 csrf 开启时使用 CKEDITOR 的问题。谢谢
      【解决方案5】:

      像这样使用 codeigniter 表单开启器:

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

      有关更多信息,请参阅 codeigniter 表单文档。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          我同时使用 Codeigniter 3.0.6 和 CommunityAuth 3,登录后出现此错误。

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

          我在 CI 的 config.php 中的 'base_url' 设置为类似于 'www.mysite.com'

          当您使用“mysite.com”浏览网站(注意“www”不在地址中)并使用 CI 的“base_url”设置提交表单时,就像 CommunityAuth 的登录一样,那么 CSRF 检查失败并且您get '您请求的操作是不允许的。'错误。

          【讨论】:

          • 我认为这个问题的一个很好的解决方案是选择一个“首选”地址 - 无论是“www”还是不带 - 并使用 htaccess 将所有流量重定向到该首选地址。除了解决这个问题,它还会防止搜索引擎分别索引 www 和非 www 的内容,这会损害搜索引擎的排名。我的重写如下:## REWRITE www traffic to root domainRewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]RewriteRule ^(.*)$ http://%1/$1 [R=302,L](仅供参考-我似乎无法在这里换行-对不起,太草率了)
          【解决方案8】:

          我在使用 Codeigniter 3 时遇到同样的问题

          您请求的操作不被允许。

          根据 Isaac Pak 的观点,我将 base_url 更改为我通常在地址栏输入的内容。像这样……

          而不是放

          http://www.domain.org

          我是这样写的。。

          http://domain.org

          因为我的base_url() 只是..

          $config['base_url'] = 'http://domain.org/';

          该修复适用于我的网站...

          【讨论】:

            【解决方案9】:

            对我来说,问题是我正在将视图加载到索引中,然后我进行了如下更改并且它起作用了:

            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');
            }
            

            【讨论】:

              【解决方案10】:

              当 $_COOKIE 中的 CSRF 令牌与您的 $_POST['csrf_token_name'] 不匹配时,system/core/Security.php 中的函数 csrf_show_error() 会引发此错误。

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

              否则,cookie 没有被传递,这意味着无法进行匹配。

              【讨论】:

                【解决方案11】:

                我发现使用表单辅助函数

                例子

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

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

                【讨论】:

                  猜你喜欢
                  • 2016-04-03
                  • 2014-02-08
                  • 2017-03-21
                  • 2017-05-14
                  • 2018-01-24
                  • 2023-03-10
                  • 2018-03-16
                  • 2016-07-25
                  • 2019-09-13
                  相关资源
                  最近更新 更多