- Подробности
-
Категория: PHP. Система
В связи с тем, что очень часто возникают вопросы по глобальным переменным и проблемам, связанным с отключением директивы 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']