gpt4 book ai didi

apache - Codeigniter 拒绝使用 apache 配置访问 Controller 目录

转载 作者:行者123 更新时间:2023-12-03 10:06:28 26 4
gpt4 key购买 nike

我想限制对仅用于管理目的的 Controller 文件夹的访问。我尝试了很多方法,但没有提出解决方案。这些 Controller 有密码保护。但是,如果有人偶然发现了正确的目录,我想将其从 View 中删除。这可以做到吗?我宁愿不从 htaccess 做。我可以访问 apache 配置文件,所以我想在那里处理它。

它与 Codeigniter 的路由方式有什么关系吗?或者,我是不是很遥远?

我正在使用的这个不起作用

<Directory /var/www/application/controllers/folder/>
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx
</Directory>

最佳答案

由于我们重写 url 以使用 CI 的方式,您永远不会匹配您的 Apache 配置,因为您实际上是在请求 index.php?{args} .如果要过滤,则必须在 CI 中进行。您的选择是核心 Controller 或 Hook 。

一个简单的方法是创建一个您的管理/区域脚本扩展的核心 Controller ,并在那里检查 IP。

像这样的东西:
application/core/MY_Controller.php :

class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->config('permitted_ips');
// check visitor IP against $config['ips'] array, redirect as needed
}
}

然后,在您的“敏感” Controller 中,扩展 MY_Controller:
application/controllers/admin/seekrit.php
class Seekrit extends MY_Controller
{
public function __construct() {
parent::__construct();
/* at this point any invalid IP has been redirected */
}
}

现在,如果您已经将核心 Controller 用于其他用途,只需检查 $this->uri->segment()在加载允许的 IP 配置文件并检查/重定向/死亡或您需要做的任何其他事情之前查看它们是否在受限区域。

此外,如果您不需要一个构造函数,则无需在管理 Controller 中使用构造函数,因为如果未定义父级将被构造。如果您定义一个,请务必调用 parent 。

您还可以将白名单放入数据库、Redis 等中。

另一种方法是通过 using hooks ,特别是 pre_controller钩。进入该 Hook 时,所有安全类和基类都已运行。如果您想以更细化的方式保护部分或全部路由,这将是合适的。在那里,您可以定义一个包含路由的数组,例如:
$protected_routes = array(
'foo' => array(
'allow_ip' => '1.2.3.4',
'redirect_if_not' => site_url('goaway')
)
)

然后,在您的钩子(Hook)类(或函数)中匹配第一段(我的示例只是一个函数):
$CI = get_instance();
$CI->load-config('my_hook');
$protected_routes = $CI->config->item('protected_routes');
$segment = $CI->uri->segment(1); // foo
if (in_array($segment, $protected_routes)) {

// grab $protected_routes[$segment] and work with it
}

这样做的好处是不会弄乱您的核心 Controller ,因为许多人使用它作为在方法之间共享代码的一种方式。但是,该 Hook 将在每个请求上运行,这意味着向 Bootstrap 添加另外两个文件加载。

我在大型 RESTful 服务上使用了 hook 方法,通过要求额外的 header 来保护某些端点,并对其他端点实现不同类型的速率限制。请注意,上面的代码只是钩子(Hook)中的一个示例,而不是如何设置钩子(Hook)本身。阅读 CI 手册的 hooks 部分,它非常简单直接。

最后,如果你真的想通过 .htaccess ,您必须按照请求本身进行。目录 application/controllers/foo从未输入,实际请求是 /foo/controller/method{args} ,这会导致 CI​​ 实例化 foo/controller.php类(class)。请记住,一旦重写,服务器会看到 index.php?....
为此,您可以根据请求 URI 模式重新编写,如下所示(尚未测试,YMMV):
RewriteRule (^|/)foo(/|$) - [F,L]

可用于将访问虚拟路径的任何人重定向到 protected Controller 。这可能更可取,因为它可以防止 PHP 需要处理它,但是您失去了对匹配时发生的事情的控制粒度。不过,如果您有多个敏感区域需要保护,您可以使用类似上述重写与钩子(Hook)或核心实现相结合的方法。

关于apache - Codeigniter 拒绝使用 apache 配置访问 Controller 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13734113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com