我创建了一个名为Gallery的模块,它在我的localhost版本2.0.3上正常工作,但是当在远程站点上使用版本2.1.0时,我无法提交表单,我收到错误:
不允许您请求的操作。
为什么会这样?
答案 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');
}