Защита от 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);