Эмуляция директивы register_globals on


Эмуляция register_globals = On в PHP

Иногда нужно эмулировать register_globals = On, когда этот параметр установлен в Off и доступа на его изменение нету. Или нужно это делать не для всего кода, а для каких-то старых и/или коряво написанных скриптов.

Тогда можно воспользоваться таким решением:

которое можно поместить в отдельный файл и подключать его с помощью require_once вначале работы скрипта.

Комментарии по теме (PHP):

Alexey Miroshko: есть хорошая функция extract ;)
Отправлено: [04.11.2008 13:20:24]

Веб программирование и разработка сайтов, Киев.

Использование глобальных переменных (Register_Globals)

Наверное, наиболее спорным моментом в разработке PHP стала замена значения по умолчанию для опции register_globals с ON на OFF в версии » 4.2.0. Большинство пользователей доверились разработчикам, даже не зная, что это за опция и как она влияет на работу PHP. Эта страница документации призвана показать, как эта настройка сочетается с вопросами безопасности при разработке приложений. Следует понимать, что сама по себе эта опция никак не влияет на безопасность, ургозу представляет некорректное использование предоставляемых ею возможностей.

В случае, если значение параметра register_globals ON, перед выполнением вашего кода будут инициализированы различные переменные, например, переменные, переданные при отправке формы. Также, учитывая тот факт, что PHP не требует инициализации переменных, написать потенциально опасный код очень легко. Это было очень спорным решением, но общество разработчиков PHP решило изменить значение по умолчанию этой директивы на OFF. В противном случае при написании кода разработчики не могли бы с уверенностью сказать, откуда пришла та или иная переменная и насколько она достоверна. До такого нововведения переменные, определяемые разработчиком внутри скрипта, и передаваемые пользователем внешние данные могли перемешиваться. Приведем простой пример злоупотребления конфигурационной опцией register_globals:

Пример #9 Пример опасного кода с register_globals = on

// устанавливаем переменную $authorized = true только для пользователей, прошедших авторизацию
if ( authenticated_user ()) <
$authorized = true ;
>

// Поскольку в случае неудачи при проверке авторизации переменная $authorized
// не установлена, она может быть установлена автоматически, благодаря register_globals,
// например, при GET запросе GET auth.php?authorized=1.
// Таким образом, пройти эту проверку можно без авторизации
if ( $authorized ) <
include «/highly/sensitive/data.php» ;
>
?>

В случае register_globals = on логика работы скрипта может быть нарушена. В случае, если установленное значение off, переменная $authorized не может быть установлена из внешних данных запроса, и скрипт будет работать корректно. Но все же инициализация переменных — один из признаков хорошего тона в программировании. Например, в приведенном выше участке кода мы могли поместить $authorized = false в качестве первой строки. Такой код работал бы как со значением on, так и off опции register_globals, и подразумевая, что по умолчанию пользователь не проходил авторизацию.

Приведем еще один пример, использующий сессии. В случае, если register_globals = on, мы можем использовать переменную $username в приведенном ниже примере, но тогда у нас не будет уверенности в достоверности ее значения (к примеру, она могла быть передана в GET-запросе).

Пример #10 Пример использования сессий со значением register_globals on или off

// Мы не знаем, откуда получена переменная $username, но точно знаем, что
// переменная $_SESSION хранит в себе данные сессии
if (isset( $_SESSION [ ‘username’ ])) <

echo «Hello Guest
» ;
echo «Would you like to login?» ;

Также существует возможность реализации оперативного реагирования в случае попытки подмены переменных. Так как во время разработки приложения мы знаем ожидаемое значение переменной, а также знаем ее достоверное значение, мы можем их сопоставить. Это не защитит код от подмены переменных, но усложнит перебор возможных вариантов. Если вы не хотите знать, как именно были получены внешние данные, используйте переменную $_REQUEST , которая состоит из данных GET и POST запросов, а также данных COOKIE. Также, информацию об этом можно найти в разделе внешние данные в PHP.

Пример #11 Обнаружение попытки подмены переменных

if (isset( $_COOKIE [ ‘MAGIC_COOKIE’ ])) <

// MAGIC_COOKIE получена из достоверного источника.
// Для полной уверенности необходимо проверить ее значение.

> elseif (isset( $_GET [ ‘MAGIC_COOKIE’ ]) || isset( $_POST [ ‘MAGIC_COOKIE’ ])) <


mail ( «admin@example.com» , «Обнаружена попытка взлома» , $_SERVER [ ‘REMOTE_ADDR’ ]);
echo «Обнаружено нарушение безопасности, администратор уведомлен.» ;
exit;

// MAGIC_COOKIE в данных запроса не присутствует
>
?>

Следует понимать, что установка register_globals в off не сделает ваш код безопасным. Каждую полученную от пользователя переменную следует проверять на соответствие ожидаемому значению. Всегда проверяйте ввод пользователя и инициализируйте все используемые переменные. Для проверки на наличие неинициализированных переменных можно включить в опцию error_reporting() отображение ошибок категории E_NOTICE.

Замечание: Суперглобальные переменные: замечание о доступности

Начиная с PHP 4.1.0, стали доступными суперглобальные массивы, такие как $_GET , $_POST , $_SERVER и т.д. Дополнительную информацию смотрите в разделе руководства superglobals

Как я могу эмулировать register_globals в PHP 5.4 или новее?

Я работаю над структурой, которая использует register_globals . Моя локальная версия php 5.4.

Я знаю, что register_globals устарела с PHP 5.3.0 и удалена в PHP 5.4, но я должен заставить этот код работать на PHP 5.4.

Есть ли способ эмулировать функциональность в новых версиях PHP?

Вы можете эмулировать register_globals , используя extract в глобальной области видимости:

Или поместите его в независимую функцию, используя глобальные и переменные переменные

Если у вас есть выпущенное приложение и вы не хотите ничего менять в нем, вы можете создать файл globals.php с помощью

затем добавьте директиву auto_prepend_file в .htaccess (или в php.ini)

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

На всякий случай это может быть полезно, это код, предложенный на php.net для эмуляции register_globals On:

Из руководства PHP говорится, что:

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

Однако поиск Google выявил этот метод на Ubuntu Forums:

Нет, наконец, он ушел навсегда. Какой бы сайт по-прежнему не использовал глобальные переменные было, что, полдюжины лет или больше, чтобы исправить код?

Самое быстрое решение — создать глобалы с нуля, запустив этот код в начале приложения:

Вы должны быть осторожны, чтобы любая переменная, созданная таким образом, еще не определена в оставшейся части script.

Вы можете заставить этот код запускать перед каждой страницей сайта используя директиву auto_prepend_file в файле .htaccess.

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


Использование глобальных переменных (Register_Globals)

Данная возможность была помечена УСТАРЕВШЕЙ начиная с версии PHP 5.3.0 и была УДАЛЕНА в версии PHP 5.4.0.

Илон Маск рекомендует:  Поле для поиска

Наверное, наиболее спорным моментом в разработке PHP стала замена значения по умолчанию для PHP-директивы register_globals с ON на OFF в версии PHP » 4.2.0. Большинство пользователей полагались на работу этой опции, даже не зная, что это за опция и думали, что это просто способ работы самого PHP. Эта страница документации призвана показать, как эта настройка сочетается с вопросами безопасности при разработке приложений. Следует понимать, что сама по себе эта опция никак не влияет на безопасность, угрозу представляет некорректное использование предоставляемых ею возможностей.

В случае, если register_globals включена, то перед выполнением вашего кода будут инициализированы различные переменные, например, переменные, переданные при отправке HTML-формы. Также, учитывая тот факт, что PHP не требует инициализации переменных, написать потенциально опасный код очень легко. Это было очень сложным решением, но сообщество PHP решило изменить значение по умолчанию этой директивы на OFF. Если директива включена, то при написании кода разработчики не могли с уверенностью сказать, откуда пришла та или иная переменная и насколько она достоверна. До такого нововведения переменные, определяемые разработчиком внутри скрипта, и передаваемые пользователем внешние данные могли перемешиваться. Приведем простой пример злоупотребления конфигурационной опцией register_globals:

Пример #1 Пример опасного кода с register_globals = on

// устанавливаем переменную $authorized = true только для пользователей, прошедших авторизацию
if ( authenticated_user ()) <
$authorized = true ;
>

// Поскольку в случае неудачи при проверке авторизации переменная $authorized
// не установлена, она может быть установлена автоматически, благодаря register_globals,
// например, при GET запросе GET auth.php?authorized=1.
// Таким образом, любой может пройти эту проверку!
if ( $authorized ) <
include «/highly/sensitive/data.php» ;
>
?>

В случае register_globals = on логика работы скрипта может быть нарушена. В случае, если установленное значение off, переменная $authorized не может быть установлена из внешних данных запроса, и скрипт будет работать корректно. Но все же инициализация переменных — один из признаков хорошего тона в программировании. Например, в приведенном выше участке кода мы могли поместить $authorized = false в качестве первой строки. Такой код работал бы как со значением on, так и off опции register_globals, и подразумевая, что по умолчанию пользователь не проходил авторизацию.

Приведем еще один пример, использующий сессии. В случае, если register_globals = on, мы можем использовать переменную $username в приведенном ниже примере, но тогда у нас не будет уверенности в достоверности ее значения (к примеру, $username могла быть передана в GET-запросе через URL).

Пример #2 Пример использования сессий со значением register_globals on или off

// Мы не знаем, откуда получена переменная $username, но точно знаем, что
// переменная $_SESSION хранит в себе данные сессии
if (isset( $_SESSION [ ‘username’ ])) <

echo «Hello Guest
» ;
echo «Would you like to login?» ;

Также существует возможность реализации оперативного реагирования в случае попытки подмены переменных. Так как во время разработки приложения мы знаем ожидаемое значение переменной, а также знаем ее достоверное значение, мы можем их сопоставить. Это не защитит код от подмены переменных, но усложнит перебор возможных вариантов. Если вы не хотите знать, как именно были получены внешние данные, используйте переменную $_REQUEST, которая является смесью из данных GET и POST запросов, а также данных COOKIE. Также, информацию об этом можно найти в разделе внешние данные в PHP.

Пример #3 Обнаружение попытки подмены переменных

if (isset( $_COOKIE [ ‘MAGIC_COOKIE’ ])) <

// MAGIC_COOKIE получена из достоверного источника.
// Для полной уверенности необходимо проверить ее значение.

> elseif (isset( $_GET [ ‘MAGIC_COOKIE’ ]) || isset( $_POST [ ‘MAGIC_COOKIE’ ])) <

mail ( «admin@example.com» , «Обнаружена попытка взлома» , $_SERVER [ ‘REMOTE_ADDR’ ]);
echo «Обнаружено нарушение безопасности, администратор уведомлен.» ;
exit;

// MAGIC_COOKIE в данных запроса не присутствует

Следует понимать, что установка register_globals в off не сделает ваш код безопасным. Каждую полученную от пользователя переменную следует проверять на соответствие ожидаемому значению. Всегда проверяйте ввод пользователя и инициализируйте все используемые переменные! Для проверки на наличие неинициализированных переменных можно включить в опцию error_reporting() отображение ошибок категории E_NOTICE .

О том, как эмулировать включенное или отключенное состояние register_globals, смотрите этот FAQ.

Эмуляция директивы register_globals on

Скидка 25% на все тарифы хостинга по промокоду STDCITF


register_globals=On? Вы в опасности!

Что представляет собой register_globals?
Это опция в php.ini, которая указывает на необходимость регистрации переменных, полученных методом POST или GET в глобальный массив $GLOBALS.

Для ясности приведу пример при register_globals=On.
Есть файл «index.php» с содержимым:

$asd . ‘ — локальная переменная
‘ ;
echo $GLOBALS [ ‘asd’ ]. ‘ — ссылка в глобальном массиве $GLOBALS
‘ ;
echo $_GET [ ‘asd’ ]. ‘ — $_GET[«asd»]’ ;
?>

В адресной строке напишем: index.php?asd=123

123 — локальная переменная
123 — ссылка в глобальном массиве $GLOBALS
123 — $_GET[‘asd’]

Как мы видим, создались 2 переменные: одна локальная (+ ссылка в $GLOBALS), другая в массиве $_GET. Многие не используют массив $_GET вообще, они продолжают обрабатывать переменную $asd после получения ее извне.

Но давайте вдумаемся, зачем нам «загрязнять» массив $GLOBALS? Для этого у нас есть специальные массивы, хранящие данные, переданные методами GET (массив $_GET) и POST (массив $_POST).

Тот же самый пример, но при register_globals=Off:

— глобальная переменная
— ссылка в глобальном массиве $GLOBALS
123 — $_GET[‘asd’]

Т.о. не была создана локальная переменная и для манипулирования с мы должны использовать массив $_GET.

Возможно, уже сейчас вы изменили свое мнение о register_globals.
Вероятно, вам придется, что-то переписать в своих программах, но оно того стоит.

А теперь я расскажу вам, как взломщик может воспользоваться этой опцией в своих целях, т.е. при register_globals=On.

Начну от простого к сложному.
Часто мы видим предупреждения:
Notice: Undefined variable: asd(название переменной) in ****
Что это значит? Это значит, что переменная $asd не была определена явно.
Например, некоторые люди балуются подобным:

Т.е. не определив переменную, сразу начинают ее использовать. Приведенный код по идее не страшен, но задумайтесь, а вдруг эта самая переменная $asd, в последствии записывается в файл? Например, напишем следующее в строке адреса: «index.php?asd=LUSER+» и получим: «LUSER 0123456789». Ну разве приятно будет увидеть такое? Не думаю.

Предположим мы пишем систему аутентификации пользователя:

if( $valid_user )
<
echo ‘Здравствуйте, пользователь’ ;
>
else echo ‘В доступе отказано’
?>

Привел я заведомо дырявую систему, стоит нам только написать в адресной строке «index.php?val

Этого бы не случилось, если бы мы написали так:

if( $valid_user )
<
echo ‘Здравствуйте, пользователь’ ;
>
else echo ‘В доступе отказано’
?>

Т.е. сами определили переменную $valid_user, как FALSE в случае неудачи.

Продолжим далее:
Теперь использование функции IsSet() становиться небезопасно, т.к. любой может подменить переменную на угодную ему.

Приведу пример с sql-инъекцией:


$some_conditions ) // некоторые условия
<
$where = ‘ > ;
>

echo $query = ‘SELECT id, title, description FROM table ‘
. ‘WHERE ‘ .(IsSet( $where )? $where : ‘ > )
?>

Илон Маск рекомендует:  background-position-y в CSS

В адресной строке напишем:

SELECT >UNION ALL SELECT login, password, null FROM admin where login=’admin’

И взломщик получает ваши явки и пароли:(

Как вы видите, все примеры имеют дыры в защите, которые можно эксплуатировать через включенный register_globals.

Справиться с подобным можно, если всегда определять переменную вне зависимости от условий. Или же использовать инкапсуляцию переменных в функциях, т.е. когда вы определяете функцию, то переменные внутри нее будут закрыты извне, например:

asd ()
<
// Какие то действия

if(IsSet( $where ))
<
echo $where ;
>
else echo ‘$where не существует’ ;
>
asd ();
?>

Теперь, если мы напишем в адресной строке: «index.php?where=123»
Даст: «$where не существует»
Но это при условии, что вы не устанавливаете переменную $where как глобальную, т.е. «global $where»

Я могу придумать еще очень много примеров, но думаю, что приведенных мною вам будет достаточно для понимания.
Хочу сказать, что все эти проблемы канут в лета, когда вы установите опцию register_globals=Off и попробуете заново все приведенные выше примеры.

Это можно сделать как в php.ini, но большинство хостинг провайдеров вам это не позволят, потому придется воспользоваться файлом .htaccess

Создаем файл с названием: .htaccess
Запишем в него:

php_flag register_globals off

И все, теперь некоторые вопросы безопасности решены:)

Немного о причине написания мной этой статьи:
Лично я никогда не использовал register_globals = on, т.к. мне казалось это нелогичным. Также я знал, что это еще один «+» к защите. Но в полной мере я не осознавал, насколько это может быть опасно. Случилось это когда я решил написать GSMgen — Google SiteMap generator, который должен был работать безопасно и при включенном register_globals. Когда же я начал его тестировать, у меня был шок: так как мне нравится использовать функцию IsSet(), я нашел в ней непосредственную уязвимость, и в процессе мне пришлось от этого отказаться:( Что поделаешь.

Я очень надеюсь, что эта статья изменит ваше мнение относительно register_globals. Думаю, что со временем все хостинг провайдеры будут ставить register_globals = off по умолчанию. Но пока этого нет, вы знаете как с этим бороться;-)

Ошибка PHP в директиве register_globals ­ Дневник ­ Максим Боголепов

Ошибка PHP в директиве register_globals

Недавно обновил язык PHP до php5-5.3.2. В логе web-сервера apache-2.0.63_3 появились такие ошибки:

На сервере PHP Manual есть предупреждение о том, что в будущих версиях php6.x.x использование директивы register_globals будет прекращено.

Сам я пока не программирую на языке php, для меня важно только избавиться от этих ошибок. Для этого необходимо в файле настройки языка PHP5, расположенного по пути /usr/local/etc/php.ini, закомментировать строки с упоминанием директивы register_globals:


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

  • Currently 4.00/5
  • 1
  • 2
  • 3
  • 4
  • 5

Rating: 4.0/5(5 votes cast)

Использование глобальных переменных (Register_Globals)

Данная возможность была помечена УСТАРЕВШЕЙ начиная с версии PHP 5.3.0 и была УДАЛЕНА в версии PHP 5.4.0.

Пример #1 Пример опасного кода с register_globals = on

// устанавливаем переменную $authorized = true только для пользователей, прошедших авторизацию
if ( authenticated_user ()) <
$authorized = true ;
>

// Поскольку в случае неудачи при проверке авторизации переменная $authorized
// не установлена, она может быть установлена автоматически, благодаря register_globals,
// например, при GET запросе GET auth.php?authorized=1.
// Таким образом, любой может пройти эту проверку!
if ( $authorized ) <
include «/highly/sensitive/data.php» ;
>
?>

В случае register_globals = on логика работы скрипта может быть нарушена. В случае, если установленное значение off, переменная $authorized не может быть установлена из внешних данных запроса, и скрипт будет работать корректно. Но все же инициализация переменных — один из признаков хорошего тона в программировании. Например, в приведенном выше участке кода мы могли поместить $authorized = false в качестве первой строки. Такой код работал бы как со значением on, так и off опции register_globals, и подразумевая, что по умолчанию пользователь не проходил авторизацию.

Приведем еще один пример, использующий сессии. В случае, если register_globals = on, мы можем использовать переменную $username в приведенном ниже примере, но тогда у нас не будет уверенности в достоверности ее значения (к примеру, $username могла быть передана в GET-запросе через URL ).

Пример #2 Пример использования сессий со значением register_globals on или off

// Мы не знаем, откуда получена переменная $username, но точно знаем, что
// переменная $_SESSION хранит в себе данные сессии
if (isset( $_SESSION [ ‘username’ ])) <

echo «Hello Guest
» ;
echo «Would you like to login?» ;

Также существует возможность реализации оперативного реагирования в случае попытки подмены переменных. Так как во время разработки приложения мы знаем ожидаемое значение переменной, а также знаем ее достоверное значение, мы можем их сопоставить. Это не защитит код от подмены переменных, но усложнит перебор возможных вариантов. Если вы не хотите знать, как именно были получены внешние данные, используйте переменную $_REQUEST , которая является смесью из данных GET и POST запросов, а также данных COOKIE. Также, информацию об этом можно найти в разделе внешние данные в PHP.

Пример #3 Обнаружение попытки подмены переменных

if (isset( $_COOKIE [ ‘MAGIC_COOKIE’ ])) <



// MAGIC_COOKIE получена из достоверного источника.
// Для полной уверенности необходимо проверить ее значение.

> elseif (isset( $_GET [ ‘MAGIC_COOKIE’ ]) || isset( $_POST [ ‘MAGIC_COOKIE’ ])) <

mail ( «admin@example.com» , «Обнаружена попытка взлома» , $_SERVER [ ‘REMOTE_ADDR’ ]);
echo «Обнаружено нарушение безопасности, администратор уведомлен.» ;
exit;

// MAGIC_COOKIE в данных запроса не присутствует

Следует понимать, что установка register_globals в off не сделает ваш код безопасным. Каждую полученную от пользователя переменную следует проверять на соответствие ожидаемому значению. Всегда проверяйте ввод пользователя и инициализируйте все используемые переменные! Для проверки на наличие неинициализированных переменных можно включить в опцию error_reporting() отображение ошибок категории E_NOTICE .

О том, как эмулировать включенное или отключенное состояние register_globals, смотрите этот FAQ.

How to emulate register_globals directive and session_register()/session_unregister() functions

Recently I needed to migrate legacy PHP application from PHP 5.2 to at least PHP 5.6. It is 50K+ lines application that heavily relies on enabled register_globals directive and session_register() / session_unregister() functions. This functionality has been deprecated as of PHP 5.3.0 and removed as of PHP 5.4.0. I will demonstrate how to emulate register_globals directive and session_register() / session_unregister() functions in PHP 5.6 or later.

On December 31, 2020, security support for PHP 5.6.x branch will officially cease, marking the end of all support for any version of the PHP 5.x branch. However PHP 5.x branch is still popular. According to statistics from W3Techs, about 60 percent of all web sites run on PHP 5.x branch. Therefore the following workaround to emulate register_globals directive may still be helpful for those trying to migrate legacy PHP code.

For a long time enabling register_globals directive was not recommended and could allow attacker to gain unauthorized access to the application. PHP community encourages the use of other means, such as the superglobals.

Илон Маск рекомендует:  Iis о настройке быстродействия

In my case the PHP application is for internal use only so the risk of someone attempting to attack was very minimal. Rewriting such a large application was not an option because the goal was to migrate the application to newer environment in short amount of time.

This migration guide from PHP 5.2 to PHP 5.6 was very helpful as well as these official guides (PHP 5.3, PHP 5.4, PHP 5.5 and PHP 5.6).

Official PHP documentation mentions a method to emulate register_globals directive on the FAQ page. However it does not emulate all of the functionality. For example, when global variable is updated corresponding session variable is not. If you code relies on this behavior, suggested workaround won’t work.

Below is alternative emulation of register_globals directive and session_register() / session_unregister() functions that solves the problem with updating of session variables.

Использование глобальных переменных (Register_Globals)

Данная возможность была помечена УСТАРЕВШЕЙ начиная с версии PHP 5.3.0 и была УДАЛЕНА в версии PHP 5.4.0.

Наверное, наиболее спорным моментом в разработке PHP стала замена значения по умолчанию для PHP-директивы register_globals с ON на OFF в версии PHP » 4.2.0. Большинство пользователей полагались на работу этой опции, даже не зная, что это за опция и думали, что это просто способ работы самого PHP. Эта страница документации призвана показать, как эта настройка сочетается с вопросами безопасности при разработке приложений. Следует понимать, что сама по себе эта опция никак не влияет на безопасность, угрозу представляет некорректное использование предоставляемых ею возможностей.

В случае, если register_globals включена, то перед выполнением вашего кода будут инициализированы различные переменные, например, переменные, переданные при отправке HTML-формы. Также, учитывая тот факт, что PHP не требует инициализации переменных, написать потенциально опасный код очень легко. Это было очень сложным решением, но сообщество PHP решило изменить значение по умолчанию этой директивы на OFF. Если директива включена, то при написании кода разработчики не могли с уверенностью сказать, откуда пришла та или иная переменная и насколько она достоверна. До такого нововведения переменные, определяемые разработчиком внутри скрипта, и передаваемые пользователем внешние данные могли перемешиваться. Приведем простой пример злоупотребления конфигурационной опцией register_globals:

Пример #1 Пример опасного кода с register_globals = on

// устанавливаем переменную $authorized = true только для пользователей, прошедших авторизацию
if ( authenticated_user ()) <
$authorized = true ;
>

// Поскольку в случае неудачи при проверке авторизации переменная $authorized
// не установлена, она может быть установлена автоматически, благодаря register_globals,
// например, при GET запросе GET auth.php?authorized=1.
// Таким образом, любой может пройти эту проверку!
if ( $authorized ) <
include «/highly/sensitive/data.php» ;
>
?>

В случае register_globals = on логика работы скрипта может быть нарушена. В случае, если установленное значение off, переменная $authorized не может быть установлена из внешних данных запроса, и скрипт будет работать корректно. Но все же инициализация переменных — один из признаков хорошего тона в программировании. Например, в приведенном выше участке кода мы могли поместить $authorized = false в качестве первой строки. Такой код работал бы как со значением on, так и off опции register_globals, и подразумевая, что по умолчанию пользователь не проходил авторизацию.

Приведем еще один пример, использующий сессии. В случае, если register_globals = on, мы можем использовать переменную $username в приведенном ниже примере, но тогда у нас не будет уверенности в достоверности ее значения (к примеру, $username могла быть передана в GET-запросе через URL).


Пример #2 Пример использования сессий со значением register_globals on или off

// Мы не знаем, откуда получена переменная $username, но точно знаем, что
// переменная $_SESSION хранит в себе данные сессии
if (isset( $_SESSION [ ‘username’ ])) <

echo «Hello Guest
» ;
echo «Would you like to login?» ;

Также существует возможность реализации оперативного реагирования в случае попытки подмены переменных. Так как во время разработки приложения мы знаем ожидаемое значение переменной, а также знаем ее достоверное значение, мы можем их сопоставить. Это не защитит код от подмены переменных, но усложнит перебор возможных вариантов. Если вы не хотите знать, как именно были получены внешние данные, используйте переменную $_REQUEST, которая является смесью из данных GET и POST запросов, а также данных COOKIE. Также, информацию об этом можно найти в разделе внешние данные в PHP.

Пример #3 Обнаружение попытки подмены переменных

if (isset( $_COOKIE [ ‘MAGIC_COOKIE’ ])) <

// MAGIC_COOKIE получена из достоверного источника.
// Для полной уверенности необходимо проверить ее значение.

> elseif (isset( $_GET [ ‘MAGIC_COOKIE’ ]) || isset( $_POST [ ‘MAGIC_COOKIE’ ])) <

mail ( «admin@example.com» , «Обнаружена попытка взлома» , $_SERVER [ ‘REMOTE_ADDR’ ]);
echo «Обнаружено нарушение безопасности, администратор уведомлен.» ;
exit;

// MAGIC_COOKIE в данных запроса не присутствует

Следует понимать, что установка register_globals в off не сделает ваш код безопасным. Каждую полученную от пользователя переменную следует проверять на соответствие ожидаемому значению. Всегда проверяйте ввод пользователя и инициализируйте все используемые переменные! Для проверки на наличие неинициализированных переменных можно включить в опцию error_reporting() отображение ошибок категории E_NOTICE .

О том, как эмулировать включенное или отключенное состояние register_globals, смотрите этот FAQ.

Как я могу эмулировать register_globals в PHP 5.4 или новее?

Я работаю над структурой, которая использует register_globals . Моя локальная версия php 5.4.

Я знаю, что register_globals устарела с PHP 5.3.0 и удалена в PHP 5.4, но я должен заставить этот код работать на PHP 5.4.

Есть ли способ эмулировать функциональность в новых версиях PHP?

Вы можете эмулировать register_globals , используя extract в глобальной области видимости:

Или поместите его в независимую функцию, используя глобальные и переменные переменные

Если у вас есть выпущенное приложение и вы не хотите ничего менять в нем, вы можете создать файл globals.php с помощью

затем добавьте директиву auto_prepend_file в .htaccess (или в php.ini)

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

На всякий случай это может быть полезно, это код, предложенный на php.net для эмуляции register_globals On:

Из руководства PHP говорится, что:

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

Однако поиск Google выявил этот метод на Ubuntu Forums:

Нет, наконец, он ушел навсегда. Какой бы сайт по-прежнему не использовал глобальные переменные было, что, полдюжины лет или больше, чтобы исправить код?

Самое быстрое решение — создать глобалы с нуля, запустив этот код в начале приложения:

Вы должны быть осторожны, чтобы любая переменная, созданная таким образом, еще не определена в оставшейся части script.

Вы можете заставить этот код запускать перед каждой страницей сайта используя директиву auto_prepend_file в файле .htaccess.

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

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL