1: Проверка количества включенных файлов
if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) )
{
exit('Restricted Access');
}
Логика: PHP завершается, если минимальное число включений не выполнено. Обратите внимание, что до PHP5 базовая страница не считается включаемой.
2: определение и проверка глобальной константы
// In the base page (directly accessed):
define('_DEFVAR', 1);
// In the include files (where direct access isn't permitted):
defined('_DEFVAR') or exit('Restricted Access');
Логика: если константа не определена, то выполнение не начнется с базовой страницы, и PHP прекратит выполнение.
Обратите внимание, что ради переносимости между обновлениями и будущими изменениями использование этого метода аутентификации модульным значительно уменьшит накладные расходы при кодировании, поскольку изменения не нужно будет жестко кодировать для каждого отдельного файла.
// Put the code in a separate file instead, say 'checkdefined.php':
defined('_DEFVAR') or exit('Restricted Access');
// Replace the same code in the include files with:
require_once('checkdefined.php');
Таким образом, дополнительный код может быть добавлен checkdefined.php
для регистрации и аналитических целей, а также для генерации соответствующих ответов.
Кредит, где кредит должен: блестящая идея переносимости пришла из этого ответа .
3: Удаленная авторизация адреса
// Call the include from the base page(directly accessed):
$includeData = file_get_contents("http://127.0.0.1/component.php?auth=token");
// In the include files (where direct access isn't permitted):
$src = $_SERVER['REMOTE_ADDR']; // Get the source address
$auth = authoriseIP($src); // Authorisation algorithm
if( !$auth ) exit('Restricted Access');
Недостатком этого метода является изолированное выполнение, если только токен сеанса не предоставлен с внутренним запросом. Проверьте через адрес обратной связи в случае конфигурации с одним сервером или белый список адресов для многосерверной или серверной инфраструктуры с балансировкой нагрузки.
4: авторизация токена
Как и в предыдущем методе, можно использовать GET или POST для передачи токена авторизации во включаемый файл:
if($key!="serv97602"){header("Location: ".$dart);exit();}
Очень грязный метод, но, возможно, самый безопасный и универсальный одновременно, при правильном использовании.
5: Конфигурация веб-сервера
Большинство серверов позволяют вам назначать разрешения для отдельных файлов или каталогов. Вы можете поместить все свои включения в такие ограниченные каталоги и настроить сервер на их запрет.
Например, в APACHE конфигурация хранится в .htaccess
файле. Учебник здесь .
Однако обратите внимание, что специфичные для сервера конфигурации не рекомендуются мной, поскольку они плохо переносятся между различными веб-серверами. В таких случаях, как системы управления контентом, где алгоритм deny сложен или список запрещенных каталогов довольно велик, это может сделать сеансы реконфигурации довольно ужасными. В конце концов, лучше всего справиться с этим в коде.
6: Размещение включает в безопасном каталоге за пределами корня сайта
Наименее предпочтительный из-за ограничений доступа в серверных средах, но довольно мощный метод, если у вас есть доступ к файловой системе.
//Your secure dir path based on server file-system
$secure_dir=dirname($_SERVER['DOCUMENT_ROOT']).DIRECTORY_SEPARATOR."secure".DIRECTORY_SEPARATOR;
include($secure_dir."securepage.php");
Логика:
- Пользователь не может запросить какой-либо файл за пределами
htdocs
папки, поскольку ссылки будут выходить за рамки адресной системы сайта.
- Php-сервер напрямую обращается к файловой системе и, следовательно, может обращаться к файлам на компьютере, как это делает обычная программа с необходимыми привилегиями.
- Поместив включаемые файлы в этот каталог, вы можете гарантировать, что php-сервер получит к ним доступ, в то время как горячая ссылка запрещена для пользователя.
- Даже если настройка доступа к файловой системе веб-сервера не была выполнена должным образом, этот метод предотвратит случайное обнародование этих файлов.
Пожалуйста, извините мои неортодоксальные соглашения о кодировании. Любые отзывы приветствуются.