Php register globals это

register_globals=oN? Вы в опасности!

Здравствуйте уважаемые веб-мастера, статья повествует о том, почему опасно оставлять опцию register_globals включенной. Вы, возможно, слышали, что использование её может привести к небезопасной работе вашей программы (скрипта). Но давайте разберемся, как эту опцию могут использовать в противоправных целях и как от этого защититься.

Что представляет собой register_globals ?
Это опция в php.ini, которая указывает на необходимость регистрации переменных полученные методом POST или GET в глобальный массив $GLOBALS.

Для ясности приведу пример при register_globals=on .
Есть файл «index.php» с содержимом:

'; echo $GLOBALS['asd'].' - ссылка в глобальном массиве $GLOBALS
'; echo $_GET['asd'].' - $_GET["asd"]'; ?>

В адресной строке напишем: index.php?asd=123

Как мы видим, создались 2 переменные: одна локальная (+ ссылка в $GLOBALS), другая в массиве $_GET. Многие не используют массив $_GET вообще, они продолжают обрабатывать переменную «$asd» после получения ее извне.
Но давайте вдумаемся, зачем нам «загрязнять» массив $GLOBALS? Для этого у нас есть специальные массивы, хранящие данные, переданные методами GET (массив $_GET) и POST (массив $_POST).

Тот же самый пример, но при register_globals=off :

Т.о. не была создана локальная переменная и для манипулирования с «$asd» мы должны использовать массив $_GET.

Возможно, уже сейчас вы изменили свое мнение о register_globals.
Вероятно, вам придется что-то переписать в своих программах, но оно того стоит.

А теперь я расскажу вам, как взломщик может воспользоваться этой опцией в своих целях, т.е. при register_globals=on
Начну от простого к сложному.

Часто мы видим предупреждения:

Что это значит? Это значит, что переменная «$asd» не была определена явно.
Например, некоторые люди балуются подобным:

Т.е. не определив переменную, сразу начинают ее использовать. Приведенный код по идее не страшен, но задумайтесь, а вдруг эта самая переменная «$asd», в последствие записывается в файл? Например, напишем следующее в строке адреса: «index.php?asd=LUSER+» и получим: «LUSER 0123456789». Ну, разве приятно будет увидеть такое? Не думаю.

Предположим мы пишем систему аутентификации пользователя:

 if($valid_user) < echo 'Здравствуйте, пользователь'; >else echo 'В доступе отказано' ?>

Привел я заведомо дырявую систему, стоит нам только написать в адресной строке «index.php?valid_user=1» и мы получим надпись «Здравствуйте, пользователь»

Этого бы не случилось, если бы мы написали так:

 else $valid_user=FALSE; if($valid_user) < echo 'Здравствуйте, пользователь'; >else echo 'В доступе отказано' ?>

Т.е. сами определили переменную $valid_user, как FALSE в случае неудачи.

Продолжим далее…
Теперь использование функции IsSet() становится небезопасно, т.к. любой может подменить переменную на угодную ему.

Приведу пример с sql-инъекцией:

 echo $query='SELECT id, title, description FROM table ' .'WHERE '.(IsSet($where)?$where:'id=4') ?>

В адресной строке напишем: «index.php?where=id=0+UNION+ALL+SELECT+login,+password,+null+FROM+admin+where+login=’admin’» получим sql-инъекцию:

SELECT id, title, description FROM table WHERE/> UNION ALL SELECT login, password, null FROM admin where login=’admin’

И взломщик получает ваши явки и пароли:(

Как вы видите все примеры, имеют дыры в защите, которые можно эксплуатировать через включенный register_globals.

Справиться с подобным можно, если всегда определять переменную вне зависимости от условий. Или же использовать инкапсуляцию переменных в функциях, т.е. когда вы определяете функцию, то переменные, что внутри нее будут закрыты извне, например:

 else echo '$where не существует'; > asd(); ?>

Теперь, если мы напишем в адресной строке: «index.php?where=123»
Даст: «$where не существует»
Но это при условии, что вы не устанавливаете переменную $where как глобальную, т.е. «global $where»

Я могу придумать еще очень много примеров, но думаю, что приведенных мною вам будет достаточно для понимания.
Хочу сказать, что все эти проблемы канут в лета, когда вы установите опцию register_globals=off и попробуете заново все приведенные выше примеры.

Это можно сделать как в php.ini, но большинство хостинг провайдеров вам это не позволят, потому придется воспользоваться файлом «.htaccess»

Создаем файл с названием: .htaccess
Запишем в него:

И все, теперь некоторые вопросы безопасности решены:)

Немного о причине написания мной этой статьи:
Лично я никогда не использовал register_globals = on, т.к. мне казалось это нелогичным. Так же я знал, что это еще один «+» к защите. Но в полной мере я не осознавал насколько это может быть опасно. Случилось это когда я решил написать GSMgen – Google SiteMap generator, который должен был работать безопасно и при включенном register_globals. Когда же я начал его тестировать, у меня был шок…так как мне нравится использовать функцию IsSet() я нашел в ней непосредственную уязвимость, и в процессе мне пришлось от этого отказаться:( Что поделаешь…

Я очень надеюсь, что эта статья изменит ваше мнение относительно register_globals. Думаю, что со временем все хостинг провайдеры будут ставить register_globals = off по умолчанию. Но пока этого нет, вы знаете, как с этим бороться;-)[/HTML]

Источник

Использование глобальных переменных (Register_Globals)

Данная возможность была помечена УСТАРЕВШЕЙ начиная с версии PHP 5.3.0 и была УДАЛЕНА в версии PHP 5.4.0.

Наверное, наиболее спорным моментом в разработке PHP стала замена значения по умолчанию для PHP -директивы register_globals с ON на OFF в версии PHP » 4.2.0. Большинство пользователей полагались на работу этой опции, даже не зная, что это за опция и думали, что это просто способ работы самого PHP . Эта страница документации призвана показать, как эта настройка сочетается с вопросами безопасности при разработке приложений. Следует понимать, что сама по себе эта опция никак не влияет на безопасность, угрозу представляет некорректное использование предоставляемых ею возможностей.

В случае, если register_globals включена, то перед выполнением вашего кода будут инициализированы различные переменные, например, переменные, переданные при отправке HTML -формы. Также, учитывая тот факт, что PHP не требует инициализации переменных, написать потенциально опасный код очень легко. Это было очень сложным решением, но сообщество PHP решило изменить значение по умолчанию этой директивы на OFF. Если директива включена, то при написании кода разработчики не могли с уверенностью сказать, откуда пришла та или иная переменная и насколько она достоверна. До такого нововведения переменные, определяемые разработчиком внутри скрипта, и передаваемые пользователем внешние данные могли перемешиваться. Приведем простой пример злоупотребления конфигурационной опцией register_globals:

Пример #1 Пример опасного кода с register_globals = on

// устанавливаем переменную $authorized = true только для пользователей, прошедших авторизацию
if ( authenticated_user ()) $authorized = true ;
>

// Поскольку в случае неудачи при проверке авторизации переменная $authorized
// не установлена, она может быть установлена автоматически, благодаря register_globals,
// например, при GET запросе GET auth.php?authorized=1.
// Таким образом, любой может пройти эту проверку!
if ( $authorized ) include «/highly/sensitive/data.php» ;
>
?>

В случае register_globals = on логика работы скрипта может быть нарушена. В случае, если установленное значение off, переменная $authorized не может быть установлена из внешних данных запроса, и скрипт будет работать корректно. Но все же инициализация переменных — один из признаков хорошего тона в программировании. Например, в приведенном выше участке кода мы могли поместить $authorized = false в качестве первой строки. Такой код работал бы как со значением on, так и off опции register_globals, и подразумевая, что по умолчанию пользователь не проходил авторизацию.

Приведем еще один пример, использующий сессии. В случае, если register_globals = on, мы можем использовать переменную $username в приведенном ниже примере, но тогда у нас не будет уверенности в достоверности ее значения (к примеру, $username могла быть передана в GET-запросе через URL ).

Пример #2 Пример использования сессий со значением register_globals on или off

// Мы не знаем, откуда получена переменная $username, но точно знаем, что
// переменная $_SESSION хранит в себе данные сессии
if (isset( $_SESSION [ ‘username’ ]))

echo «Hello Guest
» ;
echo «Would you like to login?» ;

Также существует возможность реализации оперативного реагирования в случае попытки подмены переменных. Так как во время разработки приложения мы знаем ожидаемое значение переменной, а также знаем ее достоверное значение, мы можем их сопоставить. Это не защитит код от подмены переменных, но усложнит перебор возможных вариантов. Если вы не хотите знать, как именно были получены внешние данные, используйте переменную $_REQUEST , которая является смесью из данных GET и POST запросов, а также данных COOKIE. Также, информацию об этом можно найти в разделе внешние данные в PHP.

Пример #3 Обнаружение попытки подмены переменных

// MAGIC_COOKIE получена из достоверного источника.
// Для полной уверенности необходимо проверить ее значение.

> elseif (isset( $_GET [ ‘MAGIC_COOKIE’ ]) || isset( $_POST [ ‘MAGIC_COOKIE’ ]))

mail ( «admin@example.com» , «Обнаружена попытка взлома» , $_SERVER [ ‘REMOTE_ADDR’ ]);
echo «Обнаружено нарушение безопасности, администратор уведомлен.» ;
exit;

// MAGIC_COOKIE в данных запроса не присутствует

Следует понимать, что установка register_globals в off не сделает ваш код безопасным. Каждую полученную от пользователя переменную следует проверять на соответствие ожидаемому значению. Всегда проверяйте ввод пользователя и инициализируйте все используемые переменные! Для проверки на наличие неинициализированных переменных можно включить в опцию error_reporting() отображение ошибок категории E_NOTICE .

О том, как эмулировать включенное или отключенное состояние register_globals, смотрите этот FAQ.

Источник

Директива register_globals

Директива register_globals

Вполне вероятно, что Вы уже слышали про директиву register_globals и знаете, что она делает. Если кто-то этого не знает, то Вы узнаете об этом из данной статьи, однако, главная задача этой статьи доказать, что директиву register_globals лучше всегда держать отключённой в целях безопасности.

Директива register_globals позволяет регистрировать переменные, полученные из GET-запроса. Допустим, был такой запрос: index.php?a=15. Таким образом, безусловно, создаётся переменная $_GET[«a»] и переменная a. Вот создание переменной a и произошло в результате включённой директивы register_globals.

Теперь о том, почему данную директиву надо всегда держать отключённой. Предположим, что Вы делаете авторизацию пользователя, и Вы написали такой код:

if (($_POST[«login»] == «Admin») && ($_POST[«password»] == «123456»)) $check_user = true;
if ($check_user) echo «Авторизация прошла успешно»;
else echo «Ошибка авторизации»;
?>

Теперь если файл называется, например, auth.php, то, обратившись к нему следующим образом: auth.php?check_user=1, то получится успешная авторизация, независимо от того, какие логин и пароль были отправлены и были ли отправлены вообще.

Безусловно, данный пример является слегка мистическим, поскольку так никто не пишет (хотя бы из-за отсутствия else $check_user = false;), однако, данный пример наглядно показывает, к чему может привести включённая директива register_globals.

Теперь о том, как же отключить директиву register_globals. Для этого надо добавить в файл .htaccess всего одну строчку:

php_value register_globals 0

Есть небольшая вероятность, что если директива была раньше включена, то у Вас может что-нибудь сломаться, поэтому всё внимательно проверьте и устраните все возникшие ошибки, поскольку безопасность того действительно стоит.

Создано 05.10.2011 12:52:17

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 2 ):

    Mihail u vas opechatka v etoj statje , v pervom obzace » ob ja napishu v etoj statje».

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

    Источник

    Читайте также:  Import sys argv python
    Оцените статью