【发布时间】:2012-05-10 03:22:51
【问题描述】:
我制作了一个名为 Gallery 的模块,该模块在我的本地主机上运行良好,版本为 2.0.3,但是在远程站点上使用版本 2.1.0 时,我无法提交表单并且出现错误:
您请求的操作不被允许。
这是为什么?
【问题讨论】:
标签: codeigniter pyrocms
我制作了一个名为 Gallery 的模块,该模块在我的本地主机上运行良好,版本为 2.0.3,但是在远程站点上使用版本 2.1.0 时,我无法提交表单并且出现错误:
您请求的操作不被允许。
这是为什么?
【问题讨论】:
标签: codeigniter pyrocms
这是一个与 CSRF 保护相关的 Codeigniter 错误。您可以在cms/config/config.php取消它
【讨论】:
<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();?>
在编程问题上,您不是解决问题,而是解决问题。我的意思是,如果它不可用,这个功能就不会在这里:'因为它是并且它对我有用。你只是在实现上有问题。
我的回答:从 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 的与您正在从事的工作相关的核心文件,以确保这样做是安全的。
无论如何,我希望这能帮助到那里的人,即使我的回答晚了一年多。
【讨论】:
我同意@Jhourlad Estrella 的观点,即解决问题而不是禁用安全功能,但我认为真正的问题在于保存令牌的隐藏输入字段。
使用form_open() 和form_close() 辅助函数来创建表单元素,而不是使用纯HTML。原因是当您使用辅助函数时,它会自动将 csrf 令牌作为隐藏字段插入到表单中。
您也可以手动执行此操作,方法是将令牌添加为表单中的隐藏输入字段
<input type="hidden" name="csrf_hash_name" value="your-hash-value-here">
这样做可以让您免受 CSRF 攻击并解决您遇到的问题。
希望这对其他人有所帮助,因为这让我第一次弄清楚这一点时发疯了。
【讨论】:
form_open()或form_close()你可以使用$this->security->get_csrf_hash();和$this->security->get_csrf_token_name();获取CSRF令牌名称和值
我有一个在 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 保护,但对于所有其他请求保持不变。
【讨论】:
像这样使用 codeigniter 表单开启器:
<php echo form_open(url,method,attributes);?>
有关更多信息,请参阅 codeigniter 表单文档。
【讨论】:
这可能是一种罕见的情况,但我没有看到我的问题,因为我的服务器有许多非常相似的不同域名。问题是我登陆了一个完全错误的域,但是因为“不允许您请求的操作”。错误优先于“ 404 Not Found Error” 我看不到它。我的问题是我没有将我的 base_url 更改为正确的域。因此,如果上述解决方案都不适合您,您可以在 application/config 中检查 $config['base_url'] 的设置。
【讨论】:
这是一个老问题,但同样的问题确实花费了我很多时间,所以我想分享一下我的问题所在。它可能对某人有所帮助。
我同时使用 Codeigniter 3.0.6 和 CommunityAuth 3,登录后出现此错误。
这很令人困惑,因为问题有时会发生,而其他时候不会。
我在 CI 的 config.php 中的 'base_url' 设置为类似于 'www.mysite.com'
当您使用“mysite.com”浏览网站(注意“www”不在地址中)并使用 CI 的“base_url”设置提交表单时,就像 CommunityAuth 的登录一样,那么 CSRF 检查失败并且您get '您请求的操作是不允许的。'错误。
【讨论】:
## REWRITE www traffic to root domainRewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]RewriteRule ^(.*)$ http://%1/$1 [R=302,L](仅供参考-我似乎无法在这里换行-对不起,太草率了)
我在使用 Codeigniter 3 时遇到同样的问题
您请求的操作不被允许。
根据 Isaac Pak 的观点,我将 base_url 更改为我通常在地址栏输入的内容。像这样……
而不是放
http://www.domain.org
我是这样写的。。
http://domain.org
因为我的base_url() 只是..
$config['base_url'] = 'http://domain.org/';
该修复适用于我的网站...
【讨论】:
对我来说,问题是我正在将视图加载到索引中,然后我进行了如下更改并且它起作用了:
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');
}
【讨论】:
当 $_COOKIE 中的 CSRF 令牌与您的 $_POST['csrf_token_name'] 不匹配时,system/core/Security.php 中的函数 csrf_show_error() 会引发此错误。
在config.php 内部,我必须确保$config['cookie_domain'] 匹配$config['base_url'],没有协议(即http(s)://)。
否则,cookie 没有被传递,这意味着无法进行匹配。
【讨论】:
我发现使用表单辅助函数
例子
<?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();?>
所以我建议现在使用所有表单辅助函数。
【讨论】: