Есть вопрос?
Зайди на форум

Поиск на сайте: Advanced

Denix - новый дистрибутив Linux. Русификация Ubuntu и установка кодеков

dkws.org.ua
Форум сайта dkws.org.ua
 
Главная    ТемыТемы    АльбомАльбом    РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Если register_globals=Off
На страницу 1, 2  След.
 
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> PHP
 
Автор Сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13748
Откуда: Кировоград, Украина

СообщениеДобавлено: Пт Dec 08, 2006 3:35 pm    Заголовок сообщения: Если register_globals=Off
Ответить с цитатой

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

СообщениеДобавлено: Сб Dec 09, 2006 3:20 pm    Заголовок сообщения:
Ответить с цитатой

Да, я как первый раз писал скрипт, то пол года не знал, в чём проблема... Sad
_________________
ArchLinux + Enlightenment 17 (E17)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение anderson.dunai@gmail.com Моб. телефон ICQ Number
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13748
Откуда: Кировоград, Украина

СообщениеДобавлено: Сб Dec 09, 2006 6:56 pm    Заголовок сообщения:
Ответить с цитатой

Довольно распространенная проблема, поэтому решил тему сделать важной
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Dimidroll

Новенький


Зарегистрирован: 26.02.2006
Сообщения: 52
Откуда: Львов

СообщениеДобавлено: Вс Dec 10, 2006 11:21 pm    Заголовок сообщения:
Ответить с цитатой

самый простой способ решения проблемы Smile

foreach($HTTP_POST_VARS as $key => $value)
eval("$".$key."='".$value."';");
foreach($HTTP_GET_VARS as $key => $value)
eval("$".$key."='".$value."';");
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13748
Откуда: Кировоград, Украина

СообщениеДобавлено: Ср Dec 13, 2006 11:27 am    Заголовок сообщения:
Ответить с цитатой

Согласен
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13748
Откуда: Кировоград, Украина

СообщениеДобавлено: Вт Фев 13, 2007 8:50 am    Заголовок сообщения:
Ответить с цитатой

Основные суперглобальные массивы:
$_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
Сообщения: 13748
Откуда: Кировоград, Украина

СообщениеДобавлено: Вт Фев 13, 2007 8:52 am    Заголовок сообщения:
Ответить с цитатой

Вот еще по теме

http://www.php.net/manual/ru/reserved.variables.php
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
yok

Участник тусовки


Зарегистрирован: 06.02.2008
Сообщения: 260
Откуда: krasnodar

СообщениеДобавлено: Вт Мар 24, 2009 12:36 pm    Заголовок сообщения:
Ответить с цитатой

Добрый день.
Так это в суперглобальных переменных проблема.
У меня на сайте был давно скрипт из формы передавалась переменная обработчику и было просто echo $nic; и выводило в браузер эту переменную, а сейчас после обновления дизайна код остался тотже но обработчик не видит переменную, у хостеров еще были изменения, поэтому я решил что тоже обновление и вот пришел сюда а тут пишется о суперглобальных значит это обновлся пхп на выше версию и естественно отключили глобальные, так я понимаю.
Спасибо всем.
Удачи
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13748
Откуда: Кировоград, Украина

СообщениеДобавлено: Вт Мар 24, 2009 12:40 pm    Заголовок сообщения:
Ответить с цитатой

да у тебя просто register_globals выключили
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
yok

Участник тусовки


Зарегистрирован: 06.02.2008
Сообщения: 260
Откуда: krasnodar

СообщениеДобавлено: Ср Мар 25, 2009 7:05 am    Заголовок сообщения:
Ответить с цитатой

Ну теперь разобрался. Спасибо.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Tuxik

Тяпницо


Зарегистрирован: 02.07.2007
Сообщения: 1521

СообщениеДобавлено: Ср Мар 25, 2009 10:18 am    Заголовок сообщения:
Ответить с цитатой

Включенная переменная register_globals может быть опасна: http://www.citforum.ru/internet/php/register_globals/
Поэтому сейчас многие хостеры отключают эту переменную. Включить ее можно, но за дополнительную плату (тогда хостер просто переведет вас на виртуальный хост).

В принципе и с register_globals=off можно нормально жить, но не всегда. Например, если нужно поставить Джоомлу, то эта переменная должна быть включена, иначе установочный скрипт не будет работать. Можно Джоомлу кинуть на хост и с register_globals=off, но для этого нужно выполнить кучу танцев с бубнами, которые не гарантируют результата.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13748
Откуда: Кировоград, Украина

СообщениеДобавлено: Ср Мар 25, 2009 12:36 pm    Заголовок сообщения:
Ответить с цитатой

Создаешь в корне файл .htaccess, в нем пишешь

php_value register_globals "on"

и никаких проблем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Tuxik

Тяпницо


Зарегистрирован: 02.07.2007
Сообщения: 1521

СообщениеДобавлено: Ср Мар 25, 2009 1:10 pm    Заголовок сообщения:
Ответить с цитатой

Не всегда помогает.
Однако самое страшное для Джоомлы - это safe_mode=on
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13748
Откуда: Кировоград, Украина

СообщениеДобавлено: Ср Мар 25, 2009 1:20 pm    Заголовок сообщения:
Ответить с цитатой

Ага по поводу safe_mode это ты прав
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Растаф




Зарегистрирован: 19.10.2010
Сообщения: 2

СообщениеДобавлено: Вт Окт 19, 2010 4:08 am    Заголовок сообщения:
Ответить с цитатой

Помогите пож.
Если я все правильно понял
<?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
Заранее спс за помощь
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> PHP Часовой пояс: GMT
На страницу 1, 2  След.
Страница 1 из 2
 Главная страница сайта
 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
© Колисниченко Денис