This page has been robot translated, sorry for typos if any. Original content here.

PHP Не передаются переменные! Проблема register_globals

PHP FAQ.

Не передаются переменные! Проблема register_globals



Все нормально. Данные в скрипт передаются. Просто при определенных настройках РНР никак не действует из них переменные. Найти свои данные можно в специальных массивах.

Во всех старых руководствах по РНР написано, что даные, полученные из формы, либо переданные по ссылке, вот так: script.php?peremennaya=znachenie&variable=value
автоматически делаются переменными PHP, $peremennaya также $variable
Эта информация устарела.
Занятие в том, что в целях безопасности, начиная с версии 4.1, РНР настраивается по умолчанию так, чтобы переданные значения никак не назначались переменным.
Получить же переданное значение можно обратившись к соответствующему массиву.
Например:
Если передаем методом GET, обратившись к скрипту по ссылке вида
script.php?var=value
или отправив форму, указав в ней method="GET",
то все переменные содержатся в массиве $_GET.
echo $_GET['var']; напечатает "value".
Если приобретаем данные из формы, отправленной методом POST, то все поля этой формы содержатся в массиве $_POST. Допустим, в форме был элемент
,
то в скрипте, какой указан в action формы, можно написать echo $_POST['var']; также станет выведена 1.

Поэтому, если вы уверены, что переменная есть, но вы никак не можете ее найти - ищите ее в суперглобальных массивах.
Подробнее о них можно чтить на русском языке в официальной документации.
То же дотрагивается также серверных переменных, таких, как $REMOTE_ADDR, $PHP_SELF. Получить их можно, обратившись к массивам $_SERVER, $_ENV либо функцией getenv -
getenv('HTTP_REFERER')
;

Переменные, зарегистрированные в сессии, следует искать в массиве $_SESSION.
Данные cookie содержатся в массиве $_COOKIE, сведения о закачанных файлах - в $_FILES
Переменные окружения - в $_ENV, но так же, существует массив $_REQUEST, в котором собраны данные из GET, POST также cookie.

Важно! Весьма в поисках переменных оказывает помощь одна их первым функций PHP - phpinfo()
ее следует применять каждый раз, в какое время вы "потеряли" переменную, вызовите phpinfo(32); в скрипте, в котором никак не работает авторизация, в скрипте, какой принимает файл при аплоаде - также все найдется!


За назначение переменных дает ответ параметр register_globals в php.ini.
Если register_globals=on, то все полученные скриптом данные будут назначены соответствующим переменным.
Разработчики PHP настоятельно рекомендуют выключать register_globals (такой режим даже введен по умолчанию во всех новых версиях) также использовать данными, полученными от пользователя, только обращаясь к соответствуюим массивам.
Это сделано потому, что при register_globals = on легко взломать кое-как написаный скрипт.
К образцу, функция авторизации выставляет переменную $admin=1, но если авторизации никак не было, то никак не действует ничего. В таком скрипте при register_globals=on весьма легко стать админом, просто обратившись к нему script.php?admin=1
Огоромное число сайтов было взломано таким образом.

К тому же, register_globals = off заставляет использовать суперглобальнми массивами ($_GET, $_POST также т.д.), что оказывает помощь избежать путаницы. ОЧЕНЬ немало людей, записав некую переменную в сессию, но потом пытаясь изменить ее значение, передавая ее скрипту методом GET, продолжительно никак не могли осознать, почему у них ничто никак не работает? Поэтому
очень важно при труду с сессиями, при любых настройках (и особенно - при register_globals=on!) трудиться только с массивом $_SESSION, как это описано в соответствующем разделе.

То есть, register_globals=off - на самом занятии никак не мишень, но средство. Побудительный мотив для программиста строчить защищенные скрипты также отвиливать путаницы.
Если вы хотите написать скрипт, никак не зависящий от настройки register_globals, также при этом защищенный - переменные нужно заявлять пред использованием. На это нацелена еще одна инициатива разработчиков PHP - написание программ при уровне отображения ошибок (error_reporting) равном E_ALL, при котором об использовании необъявленных переменных выдаются предостережения.
Именно объявление ВСЕХ переменных, используемых в скрипте также являетс гарантией от взлома. Если вы пишете программу для распространения, то гарантией ее безопасности является только объявление переменных.

Если же нет возможности переделать отделанный скрипт, но его нужно заставить трудиться при register_globals=off, то нужно не забывать, что во-первых, вы делаете потенциальную дыру у себя на сайте, но во-вторых, для этого можно воспользоваться функциями extract также import_request_variables

НО!
Бездумное использование этих функций является таким же рискованным!

Если вы хотите адаптировать древний скрипт под новые положения, то выполните приведенный код именно в таком распорядке!
import_request_variables("GPC");
extract($_SERVER);
сначала назначаются переменные, пришедшие от юзера, но потом - предопределенные серверные, чтобы первые никак не могли затереть одноименные серверные.
ВАЖНО!!!
этот код вынужден вызываться как можно раньше в скрипте. ДО всякого кода также присвоения переменных.
Поскольку он являет собой дыру похлеще register_globals=on!
Ведь если он станет вызываться позже присвоения переменных в скрипте, то хакер с легкостью перезапишет их.
Последние версии PHP сообщают вам об этом нотайсом при использовании import_request_variables.
, то правда - три года прошло с тех пор, как введены новые правила. Пора бы уже также научиться строчить скрипты правильно.

Но лучше всего использовать никак не свалеными в гуляю переменными, но соответствующими массивами. Особенно, если в одном скрипте встречаются переменные из кук, из формы, из сессии - весьма немало путаницы от этого проистекает.

Если вы впервые на этом сайте, настоятельно рекомендуется просмотреть все темы. Это никак не займет немало поры, но вопросы, тут освещенные, встретятся вам никак не однажды при программировании на PHP
by phpfaq.ru

Created/Updated: 25.05.2018

stop war in Ukraine

ukrTrident

stand with Ukraine