Codeigniter拒绝使用apache配置访问控制器目录

MAZ*_*UMA 5 apache codeigniter apache-config

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

它与Codeigniter路由的方式有什么关系吗?或者,我离开了吗?

我正在使用它不起作用

<Directory /var/www/application/controllers/folder/>
  Order deny,allow
  Deny from all
  Allow from xxx.xxx.xxx.xxx
</Directory> 
Run Code Online (Sandbox Code Playgroud)

小智 3

由于我们重写 url 以与 CI 配合使用的方式,您永远不会匹配您的 Apache 配置,因为您实际上正在请求index.php?{args}. 如果你想过滤,你必须在 CI 中进行。您的选择是核心控制器或挂钩。

一个简单的方法是创建一个由您的管理/区域脚本扩展的核心控制器,并检查那里的 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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的“敏感”控制器中,扩展 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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您已经核心控制器用于其他用途,只需$this->uri->segment()在加载允许的 IP 配置文件并检查/重定向/死亡或其他您需要执行的操作之前检查它们是否位于受限区域中即可。

另外,如果不需要,则无需在管理控制器中使用构造函数,因为如果未定义父级,则将构造父级控制器。如果您定义了家长,请务必致电家长。

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

另一种方法是使用hooks,特别是pre_controller钩子。当进入该钩子时,所有安全类和基类都已运行。如果您想以更精细的方式保护部分或全部路由,这将是合适的。在那里,您可以定义一个包含路由的数组,例如:

$protected_routes = array(
    'foo' => array(
         'allow_ip' => '1.2.3.4',
         'redirect_if_not' => site_url('goaway')
     )
)
Run Code Online (Sandbox Code Playgroud)

然后,在您的钩子类(或函数)中匹配第一段(我的示例只是一个函数):

$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
}
Run Code Online (Sandbox Code Playgroud)

这样做的优点是不会弄乱您的核心控制器,因为许多人使用它作为方法之间共享代码的手段。但是,该挂钩将在每个请求上运行,这意味着将另外两个文件加载添加到引导程序中。

我在大型 RESTful 服务上使用了钩子方法,通过要求额外的标头并对其他端点实施不同类型的速率限制来保护某些端点。请注意,上面的代码只是挂钩可以包含的内容的示例,而不是如何设置挂钩本身。阅读 CI 手册的 hooks 部分,它非常简单直接。

最后,如果您确实想通过 执行此操作.htaccess,则必须按照请求本身进行操作。该目录application/controllers/foo从未进入,实际请求是/foo/controller/method{args},这会导致 CI​​ 实例化该类foo/controller.php。请记住,一旦重写,服务器就会看到index.php?....

要实现这一点,您可以根据请求 URI 模式重写,如下所示(尚未测试,YMMV):

RewriteRule (^|/)foo(/|$) - [F,L]
Run Code Online (Sandbox Code Playgroud)

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