|
Автор |
Сообщение |
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
В связи с тем, что очень часто возникают вопросы по глобальным переменным и проблемам, связанным с отключением директивы 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'] |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Anderson
Завсегдатай
Зарегистрирован: 08.07.2006 Сообщения: 642 Откуда: localhost
|
|
|
|
Да, я как первый раз писал скрипт, то пол года не знал, в чём проблема... _________________ ArchLinux + Enlightenment 17 (E17) |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Довольно распространенная проблема, поэтому решил тему сделать важной |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Dimidroll
Новенький
Зарегистрирован: 26.02.2006 Сообщения: 52 Откуда: Львов
|
|
|
|
самый простой способ решения проблемы
foreach($HTTP_POST_VARS as $key => $value)
eval("$".$key."='".$value."';");
foreach($HTTP_GET_VARS as $key => $value)
eval("$".$key."='".$value."';"); |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Согласен |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Основные суперглобальные массивы:
$_GET['variable'] - Переменные, переданные сценарию через HTTP GET. Аналогичен массиву $HTTP_GET_VARS
$_POST['variable'] - Переменные, переданные сценарию через HTTP POST. Аналогичен массиву $HTTP_POST_VARS
Другие суперглобальные массивы:
$_COOKIE['variable'] - Переменные, переданные сценарию через HTTP cookies. Аналогичен массиву $HTTP_COOKIE_VARS
$_REQUEST['variable'] - Переменные, переданные сценарию в результате ответа пользователя на запрос (GET, POST, COOKIE) и которым, поэтому, не следует доверять.
$_GLOBALS['variable'] - Содержит ссылки на все переменные, которые в настоящий момент доступны в глобальной области видимости сценария. Ключами этого массива являются имена глобальных переменных.
$_SERVER['variable'] - Переменные, установленные web-сервером или чем-то другим, напрямую связанным со средой исполнения сценария. Аналогичен массиву $HTTP_SERVER_VARS
$_FILES['variable'] - Переменные, переданные сценарию путем передачи файла через HTTP. Аналогичен массиву $HTTP_POST_FILES
$_ENV['variable'] - Переменные, переданные сценарию через окружение. Аналогичен массиву $HTTP_ENV_VARS
$_SESSION['variable'] - Переменные, которые определены в текущей сессии сценария. Аналогичен массиву $HTTP_SESSION_VARS |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
yok
Участник тусовки
Зарегистрирован: 06.02.2008 Сообщения: 260 Откуда: krasnodar
|
|
|
|
Добрый день.
Так это в суперглобальных переменных проблема.
У меня на сайте был давно скрипт из формы передавалась переменная обработчику и было просто echo $nic; и выводило в браузер эту переменную, а сейчас после обновления дизайна код остался тотже но обработчик не видит переменную, у хостеров еще были изменения, поэтому я решил что тоже обновление и вот пришел сюда а тут пишется о суперглобальных значит это обновлся пхп на выше версию и естественно отключили глобальные, так я понимаю.
Спасибо всем.
Удачи |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
да у тебя просто register_globals выключили |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
yok
Участник тусовки
Зарегистрирован: 06.02.2008 Сообщения: 260 Откуда: krasnodar
|
|
|
|
Ну теперь разобрался. Спасибо. |
|
Вернуться к началу |
|
|
Tuxik
Тяпницо
Зарегистрирован: 02.07.2007 Сообщения: 1521
|
|
|
|
Включенная переменная register_globals может быть опасна: http://www.citforum.ru/internet/php/register_globals/
Поэтому сейчас многие хостеры отключают эту переменную. Включить ее можно, но за дополнительную плату (тогда хостер просто переведет вас на виртуальный хост).
В принципе и с register_globals=off можно нормально жить, но не всегда. Например, если нужно поставить Джоомлу, то эта переменная должна быть включена, иначе установочный скрипт не будет работать. Можно Джоомлу кинуть на хост и с register_globals=off, но для этого нужно выполнить кучу танцев с бубнами, которые не гарантируют результата. |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Создаешь в корне файл .htaccess, в нем пишешь
php_value register_globals "on"
и никаких проблем |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Tuxik
Тяпницо
Зарегистрирован: 02.07.2007 Сообщения: 1521
|
|
|
|
Не всегда помогает.
Однако самое страшное для Джоомлы - это safe_mode=on |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Ага по поводу safe_mode это ты прав |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Растаф
Зарегистрирован: 19.10.2010 Сообщения: 2
|
|
|
|
Помогите пож.
Если я все правильно понял
<?php
echo $_get['q'];
?>
должен выводить то что я передам после ?q= (например http://localhost/index.php?q=123) но почему у меня тогда ничего не отображается,
в phpinfo() переменная регистрируется в
QUERY_STRING и HTTP Request (я понимаю что это не то, но на всякий тоже указал)
_REQUEST["q"] _GET["q"] (здесь она есть)
_SERVER["QUERY_STRING"] тоже её содержит
а еще REQUEST_URI и _SERVER["REQUEST_URI"]
я думаю что косяк где-то в настройках php.ini
у меня стоит apache 2.2 no ssl и php 5.2
Заранее спс за помощь |
|
Вернуться к началу |
|
|
|
|
 Главная страница сайта
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|