Если register_globals=Off
Автор: softtime.ru
В связи с тем, что очень часто возникают вопросы по
глобальным переменным и проблемам, связанным с отключением директивы
register_globals, попробуем немного раскрыть эту тему в данной
статье.
Для начала определим, что такое внешние переменные. Это
любые переменные, которые поступают в программу извне, т.е. не определены
в самой программе. Для скрипта на php все переменные, которые передаются
через строку браузера или через форму являются внешними.
Рассмотрим,
как они создаются.
Если на сервере включена директива register_globals = On
(в php.ini), то при передаче переменных через форму или через строку
браузера, в скрипте, которому эти переменные предназначены, они будут
созданы автоматически. Т.е. если у вас в строке браузера написано:
www.server.ru/index.php?var=1, то в скрипте index.php будет автоматически
создана переменная $var со значением равным 1.
Замечание
Указанная директива является одним из самых дискуссионных
моментов в языке PHP. С одной стороны, ее использование действительно
может породить реальные проблемы с защитой PHP-сценариев, при ненадлежащем
учете возможных ошибочных ситуаций и многие разработчики справедливо
отмечают, что написание скриптов без использования глобальных переменных
на 90 % уменьшает уязвимость скриптов к различного рода атакам. С другой
стороны, на заре возникновения PHP, не одна тысяча пользователей
доверилась разработчикам языка (до версии PHP 4.3 эта директива была по
умолчанию включена), в силу чего в настоящее время имеются миллионы
реально функционирующих скриптов, написанных с использованием глобальных
переменных (Стоит отметить, что в обучающих целях иногда совершенно
нелишне писать скрипты с использованием глобальных переменных, поскольку
из замена на суперглобальные массивы сильно ухудшает читабельность кода).
В настоящий момент у большинства хост-провайдеров эта директива
включена и, по-видимому, будет оставаться включенной еще долгое время,
поскольку в противном случае может нарушиться преемственность кода.
При отключенной директиве register_globals доступ к таким
переменным возможен двумя способами:
- через ассоциативные массивы HTTP_***_VARS (HTTP_POST_VARS и
т.д.)
- через суперглобальные массивы ($_ENV, $_GET, $_POST, $_SERVER,
$_COOKIE, $_FILES и др.)
Суперглобальные массивы доступны в любой области
видимости. Разработчики PHP рекомендуют отключать на сервере директиву
register_globals и работать с переменными через суперглобальные массивы.
Эта рекомендация связана с проблемами безопасности, которые могли
возникнуть при включенной директиве register_globals.
Хотя до недавнего времени на хостингах директива
register_globals оставалась включенной. Ситуация начала меняться с выходом
PHP 5, где эта директива по умолчанию выключена и хостеры не спешат ее
включать (может быть и правильно).
Итак, что же конкретно сделать чтобы получить переменные
— нужно взять их из суперглобальных массивов. Например, для получения
переменных, переданных через строку браузера, используют массив $_GET.
Допустим, в строке браузера написано www.server.ru/index.php?var=1, Тогда
для получения переменной var в index.php нужно написать:
$var=$_GET['var'];
А, например, для получения переменных переданных из формы
методом POST в скрипте-обработчике формы нужно написать:
$var=$_POST['var'];
Характеристики загруженного файла доступны через
двумерный суперглобальный-массив $_FILES. При этом переменная со
значениями этого массива может иметь следующий вид:
- $_FILES["filename"]["name"] (содержит исходное имя файла на
клиентской машине);
- $_FILES["filename"]["size"] (содержит размер загруженного файла в
бай-тах);
- $_FILES["filename"]["type"] (содержит MIME-тип файла);
- $_FILES["filename"]["tmp_file"] (содержит имя временного файла, в
кото-рый сохраняется загруженный файл).
А для того, чтобы к примеру, воспользоваться переменной
$DOCUMENT_ROOT, нужно использовать суперглобальный массив $_SERVER:
$_SERVER['DOCUMENT_ROOT']