Codeigniter 您请求的操作不允许出错
我制作了一个名为Gallery的模块,该模块在2.0.3版的本地主机上运行良好,但在远程站点上使用2.1.0版时,我无法提交表单,出现错误: 不允许您请求的操作Codeigniter 您请求的操作不允许出错,codeigniter,pyrocms,Codeigniter,Pyrocms,我制作了一个名为Gallery的模块,该模块在2.0.3版的本地主机上运行良好,但在远程站点上使用2.1.0版时,我无法提交表单,出现错误: 不允许您请求的操作 这是为什么?这是一个与CSRF保护相关的Codeigniter错误。您可以在cms/config/config.php中取消它关于编程问题,您不需要绕过问题,而是要解决它。我想说的是,如果这个功能不可用,它就不会出现在这里了:“因为它确实存在,而且它对我很有用。”。您只是在实现方面遇到了问题 我的答案是:从application/con
这是为什么?这是一个与CSRF保护相关的Codeigniter错误。您可以在
cms/config/config.php中取消它
关于编程问题,您不需要绕过问题,而是要解决它。我想说的是,如果这个功能不可用,它就不会出现在这里了:“因为它确实存在,而且它对我很有用。”。您只是在实现方面遇到了问题
我的答案是:从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\u open()
和form\u close()
辅助函数,而不是使用普通HTML创建表单元素。原因是当您使用helper函数时,它会自动将csrf标记作为隐藏字段插入表单中
您也可以通过在表单中添加标记作为隐藏的输入字段来手动执行此操作
<input type="hidden" name="csrf_hash_name" value="your-hash-value-here">
这样做可以使您免受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未找到错误”,我无法看到它。我的问题是我没有将我的基本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检查失败,您会得到“您请求的操作不允许”。错误。我使用Codeigniter 3时也遇到同样的问题 不允许您请求的操作 基于Isaac Pak的观点,我将我的基本url更改为通常在地址栏中键入的url。像这样 而不是把
http://www.domain.org
我是这样写的
http://domain.org
因为我的base\u url()
只是
$config['base\u 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');
}
当$\u COOKIE中的csrf令牌与您的$\u POST['csrf\u令牌\u名称']不匹配时,system/core/Security.php
中的函数csrf\u show\u error()会引发此错误
在config.php
中,我必须确保$config['cookie\u domain']
匹配$config['base\u url']
,而无需协议(即http://
)
否则,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();?>
因此,我建议现在就使用所有表单帮助器功能。当然,关闭CSRF保护意味着您将面临CSRF攻击。谢谢,这对我解决使用AJAX请求、Plupload和Codeigniter上传文件时遇到的问题有很大帮助。我同意,这并不能真正解决问题,它围绕着它工作,使OP受到CSRF攻击。Joemo1984和Jhourlad Estrella有更好的答案。我们不应该鼓励不太安全的编码/开发实践。很明显,安全是必须的,所以不建议禁用CSRF。当我们在CI中启用CSRF时,在每种形式中它都会添加类似这样的内容
,但当我们使用时,就会出现上述错误因为当我们使用时,CI不会添加隐藏的输入
当我们在启用CSRF的情况下提交不带CSRF令牌的表单时,会出现上述错误。你要做的就是