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
файлі. Підручник тут .
Зверніть увагу , однак , що конфігурації сервера специфічні не рекомендується мною , тому що вони погано для портативності між різними веб-серверами. У таких випадках, як Системи управління контентом, коли алгоритм заперечення складний або список відхилених каталогів досить великий, це може зробити лише сеанси конфігурації досить жахливими. Зрештою, найкраще це обробити в коді.
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 отримує доступ до них, тоді як гарячі посилання користувачеві відмовляються.
- Навіть якщо конфігурація доступу до файлової системи веб-сервера не була виконана належним чином, цей спосіб запобігає випадковому опублікуванню цих файлів.
Вибачте, будь ласка, мої неортодоксальні умови кодування. Будь-який відгук вдячний.