PHP: код, работающий только из include`а
Итак, пока не перешел к содержанию заметки:
Замечание. Уважаемый читатели блог поменял RSS ленту. Теперь rss доступно по адресу http://feeds2.feedburner.com/kachayev.
Со старого фида идет редирект на новый. Но это будет работать только некоторое время (где-то до конца февраля). Так что, лучше переподпишитесь
![]()
П.С. Даже не спрашивайте, какой смылс был Гуглу затевать всю эту возьню… Кто ж их знает..
Так вот, собственно. Вернемся к теме разговора.
Когда-то давно, когда я вел блог по Интернет-маркетингу, у меня был отдельный раздел “Ответы на вопросы читателей”. В этом разделе я озвучивал свои ответы на те письма, которые ко мне присылали читатели. Иногда даже публиковал (с разрешения автора) исходные творения, ибо там тоже куча полезной информации… Сейчас мне тоже приходят письма от читателей и простых посетителей блога, но вопросов в них мало
Хотя иногда попадаются. Выносить эту переписку на блог не имеет смысла, потому что в основном это стандартные вопросы, аппелирующие чаще всего к мануалу.
Но.. Сегодня получил очень интересный вопрос от Виктора, который заставил меня почесать свой затылок и покурить немного мануал php…
Вопрос заключался в следующем: как сделать так, чтобы код php-файла выполнялся только в том случае, если этот файл влючен в приложение через include (или require), но не работал напрямую?
Для того, чтобы справиться с этой задачей - перечитал почти весь раздел Функции для работы с файловой системой ( http://ua2.php.net/manual/ru/ref.filesystem.php ). Кстати, очень полезно иногда такое делать. Потому что, вроде знаешь, знаешь… а тонкостей много можно найти.
Выход из поставленной ситуации был найденый такой.
/** * $_SERVER['SCRIPT_FILENAME'] = The absolute pathname of the currently executing script */ if ( realpath($_SERVER['SCRIPT_FILENAME']) == realpath(__FILE__) ) { exit; }
Думаю, логика понятна. Предположим, у нас есть файл /home/site/ajax/doit.php, который подлючает через require() файл /home/site/include/my.php. Если мы включили в последний код, который указан выше, то при вызове /home/site/ajax/doit.php:
realpath($_SERVER['SCRIPT_FILENAME']) - вернет /home/site/ajax/doit.php,
realpath(__FILE__) - вернет /home/site/include/my.php.
А как бы поступили вы?
Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!
Также читайте по теме:
- 24 января

Я бы поступил, так же, как это сделано в phpBB
В основном файле объявляем константу
define(’IN_MY_APP’, true)
А во включаемом файле вставляем:
if ( !defined(’IN_MY_APP’) )
{
die(”Hacking attempt”);
exit;
}
Тогда у нас получается лишний уровень защиты - из левых скриптов файл заинклудить тоже не даст.
Вот да, кстати, не напрямую привычно подключать именно через дефайны - еще со времен Си. Проверка пути скрипта - тоже вполне себе вариант.
Также можно держать в инклюдах только функции, но для этого нужен хороший механизм подключения и архитектура, чтобы каждый раз не было “подключил, вызвал функцию”. И есть еще один способ - запрещение через .htaccess, не помешающий инклюдам работать так, как должно.
2Сергей:
Немного не понял про .htaccess - как с его помощью можно выйти из положения?
В папках с файлами, содержащими инклюдами - .htaccess со строчками
Order Deny,Allow
Deny from all
Все, при прямом заходе Forbidden будет. А инклюдить можно легко.
Не знаю, может, есть подводные камни в способе.
Все, что приходит на ум - в этих папках нельзя хранить, например, картинки - они тупо не будут при включении.
Как я понял тут просто возврат идет…
“Кстати, очень полезно иногда такое делать. Потому что, вроде знаешь, знаешь… а тонкостей много можно найти.”
помню как яву перечитывал… оказывается половину даже и не помнил… т.к не использовал…
Какой смылс был Гуглу затевать всю эту возьню?
:D:D:D:D:D:D
Просто гуглу это выгодно.
Я бы тоже с константами сделал.
Мои пять копеек.
В головном Index.php в начале
define(”_VALID_”,1);
в инклуде в начале
defined(”_VALID_”) or die(”Доступ запрещен”);
использую защиту проверкой переменной, объявленной в главном файле и с помощью .htaccess. Пока что проблем не было.