我制作了一个名为 Gallery 的模块,该模块在我的本地主机上运行良好,版本为 2.0.3,但是在远程站点上使用版本 2.1.0 时,我无法提交表单并且出现错误:
您请求的操作是不允许的。
为什么是这样?
我制作了一个名为 Gallery 的模块,该模块在我的本地主机上运行良好,版本为 2.0.3,但是在远程站点上使用版本 2.1.0 时,我无法提交表单并且出现错误:
您请求的操作是不允许的。
为什么是这样?
我同意@Jhourlad Estrella 解决问题而不是禁用安全功能,但我觉得真正的问题在于保存令牌的隐藏输入字段。
不要使用纯 HTML 来创建表单元素,而是使用 theform_open()
和form_close()
helper 函数。原因是当您使用辅助函数时,它会自动将 csrf 令牌作为隐藏字段插入表单中。
您也可以通过将令牌添加为表单中的隐藏输入字段来手动执行此操作
<input type="hidden" name="csrf_hash_name" value="your-hash-value-here">
这样做可以让您免受 CSRF 攻击并解决您遇到的问题。
希望这对其他人有帮助,因为这让我第一次弄清楚这一点时发疯了。
这是与 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 的与您正在从事的工作相关的核心文件,以确保这样做是安全的。
无论如何,我希望这对那里的人有所帮助,即使我的回答晚了一年多。
我有一个在 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();?>
使用像上面这样的辅助函数应该会停止显示 CSRF 错误消息。
如果我不使用 echo form_input() 如果我只放置正常输入,则在重新加载时会触发 CSRF 错误。
<?php echo form_open('controller/function');?>
<input type="text" name="username" />
<?php echo form_close();?>
所以我推荐现在使用所有的表单辅助函数。
这是一个老问题,但同样的问题确实花费了我很多时间,以至于我想分享我的问题所在。它可能会帮助某人。
我正在使用 Codeigniter 3.0.6 和 CommunityAuth 3,登录后出现此错误。
这令人困惑,因为问题有时会发生,而其他时候不会。
我在 CI 的 config.php 中的“base_url”设置为“www.mysite.com”
当您使用“mysite.com”浏览网站(注意“www”不在地址中)并使用 CI 的“base_url”设置提交表单时,就像 CommunityAuth 的登录一样,那么 CSRF 检查失败并且您得到“The不允许您请求的操作。错误。
system/core/Security.php
当 $_COOKIE 中的 CSRF 令牌与您的 $_POST['csrf_token_name'] 不匹配时,函数 csrf_show_error() 会抛出此错误。
在里面config.php
,我必须确保$config['cookie_domain']
匹配$config['base_url']
,没有协议(即http(s)://
)。
否则,cookie 没有被传递,这意味着无法进行匹配。
像这样使用 codeigniter 表单开启器:
<php echo form_open(url,method,attributes);?>
有关更多信息,请参阅 codeigniter 表单文档。
这可能是一种罕见的情况,但我没有看到我的问题,因为我的服务器有许多非常相似的不同域名。问题是我登陆的域是完全错误的,但是因为“不允许您请求的操作”。错误优先于“ 404 Not Found Error” 我看不到它。我的问题是我没有将我的 base_url 更改为正确的域。因此,如果上述解决方案都不适合您,您可以在 application/config.xml 中检查 $config['base_url'] 的设置。
我使用 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');
}