| |
да и то в виде
относительного URL. Оцените, насколько это проще для будущих модифика-
ций сайта.
Листинг 29.5. Обработчик /lib/libhandler.php с подключением библиоте-
каря
// Прежде всего, устанавливаем свои каталоги поиска модулей.
// Это, по нашей договоренности, — текущий в данный момент каталог.
$INC[]=getcwd();
// Проверяем, не пытается ли пользователь запустить обработчик напрямую,
// минуя Apache — например, путем набора в браузере адреса
// /lib/libhandler.php. Так как адрес, введенный пользователем,
// всегда передается в переменной окружения REQUEST_URI, то нужно
// "бить тревогу", если переданная строка адреса встречается
Часть V. Приемы программирования на PHP
410
// в имени файла обработчика (причем в любом регистре символов).
// Мы не забыли отрезать в этой строке часть после ?, потому что
// она будет мешать при сравнении с именем файла.
// К сожалению, похоже, это единственный переносимый между операционными
// системами способ проверки легальности запуска обработчика.
$FileName=strtr(__FILE__,"\\","/");
$ReqName=ereg_Replace("\\?.*","",strtr(getenv("REQUEST_URI"),"\\","/"));
if(eregi(quotemeta($ReqName),$FileName)) {
// Выводим сообщение об ошибке
include "libhandler.err";
// Записываем в журнал данные о пользователе
$f=fopen("libhandler.log","a+");
fputs($f,date("d.m.Y H:i.s")." $REMOTE_ADDR - Access denied\n");
fclose($f);
// Завершаем работу
exit;
}
// Все в порядке — корректируем переменные окружения в соответствии
// с запрошенным пользователем адресом.
@putenv("REQUEST_URI=".
$GLOBALS["HTTP_ENV_VARS"]["REQUEST_URI"]=
$GLOBALS["REQUEST_URI"]=
getenv("QUERY_STRING")
);
@putenv("QUERY_STRING=".
$GLOBALS["HTTP_ENV_VARS"]["QUERY_STRING"]=
$GLOBALS["QUERY_STRING"]=
ereg_Replace("^[^?]*\\?","",getenv("QUERY_STRING"))
);
// Подключаем библиотекарь
include "librarian.phl";
// Здесь можно выполнить еще какие-нибудь действия...
// . . .
// Запускаем тот сценарий, который был запрошен пользователем
chdir(dirname($SCRIPT_FILENAME));
include $SCRIPT_FILENAME;
?>
Глава 29. Модульность программы. Написание "библиотекаря"
411
Ну и, конечно, какая же программа обходится без вывода диагностических сообще-
ний? Наш пример подгружает файл libhandler.err в случае "жульничества" поль-
зователя. Наверное, в нем следует написать что-то типа:
Доступ запрещен!
Доступ запрещен!
Пользователь сделал попытку нелегально вызвать обработчик Apache,
отвечающий за автоматическое подключение библиотекаря. Так как это
свидетельствует о его желании нелегально проникнуть на сервер,
попытка была пресечена. Информация о пользователе записана
в файл журнала.
В результате мы пришли к тому, что теперь все документы с расширениями html и
htm рассматрив
|
|