|
| ||||||||||||
| ||||||||||||
|
2006 г.
register_globals=On? Вы в опасности!Creator, http://www.internet-technologies.ru/
Здравствуйте, уважаемые веб-мастера, статья повествует о том, почему опасно оставлять опцию register_globals включенной. Вы, возможно, слышали, что использование её может привести к небезопасной работе вашей программы (скрипта). Но давайте разберемся, как эту опцию могут использовать в противоправных целях и как от этого защититься.
Что представляет собой register_globals? Для ясности приведу пример при register_globals=On.
В адресной строке напишем: index.php?asd=123 Получим:
Как мы видим, создались 2 переменные: одна локальная (+ ссылка в $GLOBALS), другая в массиве $_GET. Многие не используют массив $_GET вообще, они продолжают обрабатывать переменную $asd после получения ее извне. Но давайте вдумаемся, зачем нам "загрязнять" массив $GLOBALS? Для этого у нас есть специальные массивы, хранящие данные, переданные методами GET (массив $_GET) и POST (массив $_POST). Тот же самый пример, но при register_globals=Off:
Т.о. не была создана локальная переменная и для манипулирования с <$asd> мы должны использовать массив $_GET. Возможно, уже сейчас вы изменили свое мнение о register_globals. А теперь я расскажу вам, как взломщик может воспользоваться этой опцией в своих целях, т.е. при register_globals=On. Начну от простого к сложному. echo Т.е. не определив переменную, сразу начинают ее использовать. Приведенный код по идее не страшен, но задумайтесь, а вдруг эта самая переменная $asd, в последствии записывается в файл? Например, напишем следующее в строке адреса: "index.php?asd=LUSER+" и получим: "LUSER 0123456789". Ну разве приятно будет увидеть такое? Не думаю. Предположим мы пишем систему аутентификации пользователя: if( Привел я заведомо дырявую систему, стоит нам только написать в адресной строке "index.php?valid_user=1" и мы получим надпись "Здравствуйте, пользователь" Этого бы не случилось, если бы мы написали так: if( Т.е. сами определили переменную $valid_user, как FALSE в случае неудачи. Продолжим далее:
Приведу пример с sql-инъекцией: echo В адресной строке напишем:
получим sql-инъекцию:
И взломщик получает ваши явки и пароли:( Как вы видите, все примеры имеют дыры в защите, которые можно эксплуатировать через включенный register_globals. Справиться с подобным можно, если всегда определять переменную вне зависимости от условий. Или же использовать инкапсуляцию переменных в функциях, т.е. когда вы определяете функцию, то переменные внутри нее будут закрыты извне, например: Теперь, если мы напишем в адресной строке: "index.php?where=123"
Я могу придумать еще очень много примеров, но думаю, что
приведенных мною вам будет достаточно для понимания.
Это можно сделать как в php.ini, но большинство хостинг провайдеров вам это не позволят, потому придется воспользоваться файлом .htaccess Создаем файл с названием: .htaccess
И все, теперь некоторые вопросы безопасности решены:) Немного о причине написания мной этой статьи:
Я очень надеюсь, что эта статья изменит ваше мнение относительно register_globals. Думаю, что со временем все хостинг провайдеры будут ставить register_globals = off по умолчанию. Но пока этого нет, вы знаете как с этим бороться;-) Если у вас возникли вопросы, вы можете задать их на форуме http://www.internet-technologies.ru/forums/ или лично мне http://www.internet-technologies.ru/feedback.html Удачи вам! |
|
CITForum © 1997–2025