Может ли кто-нибудь привести примеры того, что такое 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 контролирует доступ к форме, серверу и среде. переменные.
Вы можете получить доступ к атрибуту формы без глобальных массивов (GET [], POST [] & REQUEST [])
Пример: http://www.example.com/one.php?myinput=abc
Вы можете получить доступ непосредственно в one.php
echo $myinput; // abc
Вы должны получить доступ ко всем атрибутам только глобальным массивам.
Пример: 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 есть девять суперглобальных переменных. Некоторые из них имеют отношение к этому обсуждению.
$_REQUEST
$_POST
$_GET
$_COOKIE
Теперь давайте сосредоточимся на $_REQUEST
_REQUEST. Он используется для сбора данных после отправки HTML-формы пользователем с использованием метода POST
.
$_POST
и $_REQUEST
могут использоваться взаимозаменяемо. Но $_REQUEST
также содержит $_GET
и $_COOKIE
вместе с $_POST
поэтому вы не уверены, что ваши данные поступают из веб-формы.
Теперь, как указано @Tim register_globals
, это внутренний параметр PHP, который регистрирует элементы массива $_REQUEST
в качестве переменных. Он также известен как flag
в настройках php. Обычно он задается в файле конфигурации PHP, известном как файл php.ini
. Этот параметр может иметь два значения.
Значение «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.