## Нулевые байты и безопасность

Поскольку для работы с файловой системой PHP внутренне вызывает функции языка C, он иногда обрабатывает нулевые байты неожиданным образом. Поскольку в C нулевые байты обозначают конец строки, PHP не принимает всю строку с NUL-байтом, а только до позиции перед нулевым байтом. Следующий пример содержит уязвимый код, который показывает проблему:

Пример #1 Пример уязвимого скрипта с NUL-байтом

    <?php

    $file = $_GET['file']; // "../../etc/passwd\0"

    if (file_exists('/home/wwwrun/' . $file . '.php')) {
        // Функция file_exists() вернёт true, поскольку путь /home/wwwrun/../../etc/passwd существует
        include '/home/wwwrun/' . $file . '.php';

        // PHP подключит файл /etc/passwd
    }

    ?>

Поэтому каждую испорченную строку, которая участвует в операциях с файловой системой, требуется правильно проверять. Вот улучшенная версия предыдущего примера:

Пример #2 Корректная проверка входных данных

    <?php

    $file = $_GET['file'];

    // Белый список возможных значений
    switch ($file) {
        case 'main':
        case 'foo':
        case 'bar':
            include '/home/wwwrun/include/' . $file . '.php';
            break;
        default:
            include '/home/wwwrun/include/main.php';
    }

    ?>

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open