Использование опции register-globals

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

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

Пример 5-14. Программа с register_globals=on

<?php
if ($username) {  // может быть подменена пользователем в get/post/cookies
    $good_login = 1;
}

if ($good_login == 1) { // также может быть подменена пользователем в get/post/cookies
    fpassthru ("/highly/sensitive/data/index.html");
}
?>

Пример 5-15. Программа с register_globals = off

<?php
if($_COOKIE['username']){
    // может прийти только из записи cookie, нормальной или поддельной
    $good_login = 1;
    fpassthru ("/highly/sensitive/data/index.html");
}
?>
Разумно используя данный метод, можно даже принять меры предотвращения подмены данных, предупреждая, когда таковая предпринимается. Если известно, где должна быть необходимая переменная, можно проверить, не идет ли она от недопустимого источника. Это не гарантирует отсутствие подмены данных, но злоумышленнику придется искать правильный путь подмены.

Пример 5-16. Простейшая проверка на подмену данных

<?php
if ($_COOKIE['username'] &&
    !$_POST['username'] &&
    !$_GET['username'] ) {
    // произвести проверку имени пользователя
    $good_login = 1;
    fpassthru ("/highly/sensitive/data/index.html");
} else {
   mail("admin@example.com", "Возможна подмена данных ", $_SERVER['REMOTE_ADDR']);
   echo "Ошибка безопасности. Произведено оповещение администратора.";
   exit;
}
?>
Конечно, выключение register_globals не означает, что программа безопасна. Все входные данные все равно требуют дополнительной проверки.