Что такое register_globals в PHP?

Может ли кто-нибудь привести примеры того, что такое register_globals ?
И global $user_id; считается регистром глобальным?

Директива register_globals :

register_globals – это внутренний параметр PHP, который регистрирует элементы массива $_REQUEST в качестве переменных. Если вы отправляете значение в форме, через POST или GET , значение этого ввода будет автоматически доступно через переменную в скрипте PHP, названном именем имени поля ввода.

Другими словами, если вы отправили форму, содержащую текстовое поле username , выражение ($username === $_POST['username']) в самом начале скрипта вернет true .

Его известность объясняется тем, что он открывает много дыр в безопасности, особенно для людей, которые следуют за чем-то меньшим, чем строгий стиль кодирования с точки зрения безопасности.

Классический пример:

 if(user_is_admin($user)) { $authorized = true; } if($authorized) { // let them do anything they want } 

Теперь, если вы посетили этот скрипт в веб-браузере, а на сервере были register_globals , вы могли бы просто добавить ?authorized=1 к URL-адресу, и божественный режим будет включен!

global ключевое слово:

global – ключевое слово имеет мало общего с register_globals.

Вот пример его использования:

 $foo = 'bar'; baz(); function baz() { echo $foo; // PHP warns you about trying to use an uninitialized variable // and nothing is output (because $foo doesn't exist here) } buzz(); function buzz() { global $foo; // Enables the use of $foo in this scope echo $foo; // Prints 'bar' to screen } 

Все, кто упоминает GET , POST , REQUEST , COOKIE , влияют на register_globals=on .

Я просто пишу это, чтобы вы знали это –

$_SESSION будет затронуто также из-за register_globals=on . http://php.net/manual/en/security.globals.php

Это означает, что если вы сделаете следующее:

 $_SESSION[x] = 123; $x = 'asd'; echo $_SESSION[x]; 

Выход будет таким же.

И это вызовет серьезные проблемы безопасности и ошибки. Недавно я столкнулся с такой плохой проблемой при использовании хостинга Hostgator. По умолчанию у них есть register_globals=on .

Когда у вас есть register_globals = on, все, что передается через GET или POST или COOKIE, автоматически становится глобальной переменной в коде, это может иметь последствия для безопасности.

Т.е. вы нажимаете на url test.php? Access_level = 100, и у вас будет $ access_level = 100 в PHP.

Когда вы делаете глобальный $ somevar – вы создаете свою собственную глобальную переменную, которая обычно не является большой проблемой.

Параметр register_globals контролирует доступ к форме, серверу и среде. переменные.

register_globals = On:

Вы можете получить доступ к атрибуту формы без глобальных массивов (GET [], POST [] & REQUEST [])

Пример: http://www.example.com/one.php?myinput=abc

Вы можете получить доступ непосредственно в one.php

 echo $myinput; // abc 

register_globals = Выкл:

Вы должны получить доступ ко всем атрибутам только глобальным массивам.

Пример: http://www.example.com/one.php?myinput=abc

Вы должны получить доступ в one.php

 echo $_GET['myinput']; //abc 

Как я понимаю, если вы включили глобальные регистры, все, что передается в GET или POST, автоматически преобразуется в переменную в PHP.

например:

 http://www.domain.com/vars.php?myvar=123 

без какого-либо дальнейшего кодирования, это автоматически превратится в переменную, доступную для остальной части вашего php-кода

 $myvar //with a value of 123 

С зарегистрированными глобальными значениями ВЫКЛ данные, переданные через GET или POST, НЕ автоматически преобразуются в переменную, скорее вам нужно запросить его, используя Superglobals $ _GET, $ _POST и $ _REQUEST и т. Д.

http://php.net/manual/en/security.globals.php предоставляет дополнительную информацию о последствиях для безопасности.

Другие могут отреагировать на меня, если я ошибаюсь.

редактировать:

в отношении вашего вопроса re global $user_id; , это не создает «глобального» в смысле «register_globals». Он просто изменяет область действия переменной в PHP-коде.

Дополнительную информацию можно получить по адресу: http://php.net/manual/en/language.variables.scope.php

Глобальные переменные в php – это переменные, которые всегда доступны. Они также известны как суперглобалы. Они встроены в переменные, которые всегда доступны независимо от области действия.

В PHP есть девять суперглобальных переменных. Некоторые из них имеют отношение к этому обсуждению.

  1. $_REQUEST
  2. $_POST
  3. $_GET
  4. $_COOKIE

Теперь давайте сосредоточимся на $_REQUEST _REQUEST. Он используется для сбора данных после отправки HTML-формы пользователем с использованием метода POST .

$_POST и $_REQUEST могут использоваться взаимозаменяемо. Но $_REQUEST также содержит $_GET и $_COOKIE вместе с $_POST поэтому вы не уверены, что ваши данные поступают из веб-формы.

Теперь, как указано @Tim register_globals , это внутренний параметр PHP, который регистрирует элементы массива $_REQUEST в качестве переменных. Он также известен как flag в настройках php. Обычно он задается в файле конфигурации PHP, известном как файл php.ini . Этот параметр может иметь два значения.

  1. "на"
  2. «Выключено».

Значение «on» означает, что PHP автоматически создаст глобальные переменные для многих переменных сервера, а также параметры строки запроса. Это нехорошо и представляет угрозу безопасности.

Регистрировать глобалы:

register_globals Функция вызывает передачу данных в скрипт PHP через файлы cookie или GET и POST-запросы, которые становятся доступными в качестве глобальных переменных в скрипте.

Значение по умолчанию: «0»

Сменный: PHP_INI_PERDIR

register_globals зависит от директивы variables_order.

ЗАМЕТКА:

Эта функция была DEPRECATED с PHP 5.3.0 и удалена с PHP 5.4.0.