Защита от LFI-подобных уязвимостей, когда файл еще не существует

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

$path = realpath($_GET['path']);
// Protect against LFI vulnerabilities
if (substr($path, 0, strlen($root)) == $root)
{
    // safe
}

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

Я не могу использовать realpath(), я должен просто проверить и удалить ссылки '..'? Или есть лучший способ?

1 ответ

Решение

Как насчет проверки, находится ли realpath(dirname($file)) в корневом каталоге?

$dir = $path;
$found = false;

while ($dir) {
    $dir = dirname($dir);
    if (!is_dir($dir)) {
        continue;
    }

    if (strpos(realpath($dir), $root) === 0) {
        $found = true;
    }

    break;
}

var_dump($found);
Другие вопросы по тегам