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' ]; $_POST [ 'var' ]; також стане виведена 1.

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

Змінні, зареєстровані в сесії, слід шукати в масиві $_SESSION .
Дані cookie містяться в масиві $ _COOKIE, відомості про закачані файлах - в $ _FILES
Змінні оточення - в $ _ENV, але так само, існує масив $ _REQUEST, в якому зібрані дані з GET, POST також cookie.

Важливо! Вельми в пошуках змінних надає допомогу одна їх першим функцій PHP - phpinfo () phpinfo ()
її слід застосовувати кожен раз, в який час ви "втратили" змінну, викличте phpinfo ( 32 ); 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