Из-за того, что мы переписываем 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
}
}
Затем в ваших «чувствительных» контроллерах расширьте 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 */
}
}
Теперь, если вы уже используете основной контроллер для чего-то другого, просто проверьте $this->uri->segment()
, чтобы увидеть, находятся ли они в зоне с ограниченным доступом, прежде чем загружать разрешенный файл конфигурации IP и проверять/перенаправлять/умирать или что-то еще. еще нужно сделать.
Кроме того, нет необходимости использовать конструктор в ваших контроллерах администратора, если он вам не нужен, поскольку родитель будет создан, если он не определен. Просто не забудьте позвонить родителю, если вы его определяете.
Вы также можете поместить белый список в базу данных, Redis, что угодно.
Другой способ сделать это — использовать хуки, в частности pre_controller
. К моменту ввода этой ловушки все классы безопасности и базовые классы уже запущены. Это было бы уместно, если бы вы хотели более детально защитить некоторые или все свои маршруты. Там вы можете определить массив, содержащий маршруты, например:
$protected_routes = array(
'foo' => array(
'allow_ip' => '1.2.3.4',
'redirect_if_not' => site_url('goaway')
)
)
Затем в вашем классе ловушек (или функции) сопоставьте первый сегмент (в моем примере это просто функция):
$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
}
Преимущество этого заключается в том, что он не загромождает ваш основной контроллер, поскольку многие люди используют его как средство совместного использования кода между методами. Однако хук будет запускаться при каждом запросе, что означает добавление еще двух загрузок файлов в загрузчик.
Я использовал метод перехвата в большой службе RESTful для защиты определенных конечных точек, требуя дополнительных заголовков и применяя различные виды ограничения скорости для других. Обратите внимание: приведенный выше код является лишь примером того, что может быть внутри хука, а не того, как настроить сам хук. Прочтите раздел хуков в руководстве по CI, это очень просто и понятно.
Наконец, если вы действительно хотите сделать это через .htaccess
, вам придется использовать сам запрос. Каталог application/controllers/foo
никогда не используется, фактический запрос — /foo/controller/method{args}
, что приводит к тому, что CI создает экземпляр класса foo/controller.php
. Помните, что после перезаписи сервер видит index.php?....
Для этого вы можете переписать на основе шаблона URI запроса что-то вроде этого (не проверял, YMMV):
RewriteRule (^|/)foo(/|$) - [F,L]
Который можно использовать для перенаправления любого, кто обращается к виртуальному пути, к вашим защищенным контроллерам. Это может быть предпочтительнее, поскольку избавляет PHP от необходимости обрабатывать его, но вы теряете детальный контроль над тем, что происходит при совпадении. Тем не менее, вы можете использовать что-то вроде приведенной выше перезаписи в сочетании с хуком или основной реализацией, если вам нужно защитить более одной чувствительной области.
person
Tim Post♦
schedule
23.12.2012
www
, где никто никогда не сможет на него наткнуться? Одна из замечательных особенностей CI заключается в том, что она позволяет вам делать это легко. - person Sparky   schedule 06.12.2012index.php
внутриwww
а все остальное снаружи. - person Sparky   schedule 06.12.2012