我制作了一个名为“Gallery”的模块,在本地版本2.0.3上运行良好,但在远程站点上使用版本2.1.0时,无法提交表单并显示以下错误:
您请求的操作是不允许的。
这是为什么?
我制作了一个名为“Gallery”的模块,在本地版本2.0.3上运行良好,但在远程站点上使用版本2.1.0时,无法提交表单并显示以下错误:
您请求的操作是不允许的。
这是为什么?
我同意@Jhourlad Estrella关于解决问题而不是禁用安全功能的想法,但我认为真正的问题在于保存令牌的隐藏输入字段。
使用form_open()
和form_close()
帮助函数而非纯HTML创建表单元素。原因是当你使用帮助函数时,它会自动将CSRF令牌作为隐藏字段插入到表单中。
你也可以手动添加令牌作为表单中的隐藏输入字段。
<input type="hidden" name="csrf_hash_name" value="your-hash-value-here">
按照这种方式操作可以保护你免受CSRF攻击,并解决你遇到的问题。
希望这对其他人有所帮助,因为第一次弄明白这个问题时让我很沮丧。
这是一个与CSRF保护相关的Codeigniter错误。 你可以在cms/config/config.php
中取消它。
<input type="hidden" name="csrf_token" value="4ac7a11a8239660afaa87cb48f2694e2" style="display:none;" />
但是当我们使用<form> .... </form>
时,上述错误会发生,因为CI在使用<form> .... </form>
时不会添加该隐藏输入,并且当我们在启用CSRF的情况下提交表单而没有CSRF令牌时,它会给出上述错误。你所要做的就是使用<?php echo form_open();?>
和<?php echo form_close();?>
。 - mapmalith在编程方面,你不能绕过问题,你必须解决它。我的意思是,如果这个功能无法使用,那么它就不会存在:因为它对我来说是可用的并且有效。你只是在实现上遇到了问题。
我的回答:从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核心文件,以确保这样做是安全的。
无论如何,我希望这能帮助到某个人,即使我的答案已经晚了一年以上。
我有一个表单,是在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 保护,但会保持对所有其他请求的完整保护。
<?php echo form_open('controller/function');?>
<?php echo form_input('username', 'Username');?>
<?php echo form_close();?>
<?php echo form_open('controller/function');?>
<input type="text" name="username" />
<?php echo form_close();?>
system/core/Security.php
中的csrf_show_error()
函数抛出,当$_COOKIE中的CSRF令牌与您的$_POST['csrf_token_name']
不匹配时。config.php
中,我必须确保$config['cookie_domain']
与$config['base_url']
匹配,不包括协议(即http(s)://
)。## 将www流量重写到根域名
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=302,L]
(FYI-我似乎无法在此处使用换行符-抱歉如此松散) - cmpreshnpublic 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');
}
使用CodeIgniter表单打开器的方法如下:
<php echo form_open(url,method,attributes);?>
form_open()
жҲ–form_close()
пјҢжӮЁеҸҜд»ҘдҪҝз”Ё$this->security->get_csrf_hash();
е’Ң$this->security->get_csrf_token_name();
иҺ·еҸ–CSRFд»ӨзүҢзҡ„еҗҚз§°е’ҢеҖјгҖӮиҜ·жіЁж„ҸпјҢзҝ»иҜ‘еҗҺзҡ„ж–Үжң¬е·Із»Ҹж¶ҰиүІе№¶жӣҙеҠ йҖҡдҝ—жҳ“жҮӮпјҢдҪҶдҝқз•ҷдәҶеҺҹе§Ӣж„ҸжҖқпјҢ并且没жңүд»»дҪ•йўқеӨ–зҡ„и§ЈйҮҠжҲ–дҝЎжҒҜиҝ”еӣһгҖӮ - Joel Kinzel