Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #71, НОЯБРЬ 2004 г.

Членораздельная адресация

Никита Кислицин

Хакер, номер #071, стр. 071-116-3


Пример обработки двухуровневых адресов

$uri=ereg_replace("^/", "", $HTTP_SERVER_VARS["REQUEST_URI"]); /* Убираем слэш из начала строки */

$uri = ereg_replace("/$", "", $uri); /* То же самое – из конца */

$dir = explode("/", $url); /* Режем строку на директории по слэшу */

if (sizeof($dir)==2) { /* Если запрошена рубрика второго уровня */

$que = "SELECT second.* FROM NAVIGATION second, NAVIGATION first where second.parent_id=first.id AND second.address='$dir[1]' AND first.address='$dir[0]'"; /* Составляем запрос, который объединяет нашу таблицу саму с собой. Он вернет такой элемент, который имеет указанный адрес, причем его отец тоже обладает указанными свойствами. Обрати внимание: этот запрос можно было разбить на несколько раздельных, но так получилось эффектнее и красивее всего. */

$res = mysql_query($que);

if (mysql_error()) {

die ("Произошла ошибка с сервером MySQL: <i> ". mysql_error()."</i> ");

} else {

/* Тут доступен найденный пункт меню */

}

} elseif (!ereg("/", $uri)) { /* Если в середине строки нет слэша, запрашивается раздел первого уровня. Тут все просто и линейно. */

$que = "SELECT * FROM NAVIGATION WHERE address='$uri'";

}

Тут все понятно из моих достаточно подробных комментариев. Совершенно ясно, что этот довольно простой парсер адреса документа может быть значительно сложнее. Кроме того, следует понимать, что крутой и опытный взломщик теоретически может научиться использовать sql-injection в моем примере. Ведь если параметр magic_quotes выключен, этот сценарий уязвим! Но все-таки найти такой баг – почти непосильная задача. Ведь взломщик наверняка не знает, каким именно образом передаются параметры сценарию и вообще есть ли какой-то сценарий. Ведь он видит перед собой обыкновенные директории. Большинство может даже не догадываться, что на самом деле имена директорий используются в php-скрипте, который и формирует вывод веб-сервера. Так что на дом тебе задание: попробуй составить такой адрес, при обработке которого наш сценарий выполнял бы любой несвойственный ему sql-запрос. Условия можешь считать самыми тепличными: magic_quotes=off и изначально известная тебе структура таблиц.

А сейчас давай прикинем все положительные моменты, которые обеспечивает придуманный только что нами метод. Ну во-первых, тебе гарантирован респект от любителей консоли: теперь они, наконец, смогут попасть в интересующий их раздел, просто введя его название на клавиатуре. Одновременно с этим ты скрываешь от посторонних глаз технологическую часть сайта и тем самым серьезно усложняешь задачу сетевым злодеям. Также, когда ты парсишь введенный пользователем адрес, целесообразно бывает сразу проверять его на корректность значения. И заметь – всегда можно вполне корректно сообщить, что, дескать, файла с именем « ‘ union select ...-- » не найдено :). Что же касается минусов, которые есть в любом подходе, то я бы выделил некоторое уменьшение производительности за счет необходимой разборки адреса. Хотя, конечно, это довольно призрачно. Куда конкретней проблемы, подстерегающие тебя при попытке добавить новые параметры. Впрочем, наш подход всегда оставляет возможность вывернуться и решить проблему. А сейчас я покажу тебе, как можно было добиться схожего результата стандартными средствами Apache.

Назад на стр. 071-116-2  Содержание  Вперед на стр. 071-116-4