Убедитесь, что пользовательский путь безопасен в PHP
-
21-08-2019 - |
Вопрос
Я реализую простой скрипт перечисления каталогов на PHP.
Я хочу убедиться, что переданный путь безопасен, прежде чем открывать дескрипторы каталогов и echo
волей-неволей добиваешься результатов.
$f = $_GET["f"];
if(! $f) {
$f = "/";
}
// make sure $f is safe
$farr = explode("/",$f);
$unsafe = false;
foreach($farr as $farre) {
// protect against directory traversal
if(strpos($farre,"..") != false) {
$unsafe = true;
break;
}
if(end($farr) != $farre) {
// make sure no dots are present (except after the last slash in the file path)
if(strpos($farre,".") != false) {
$unsafe = true;
break;
}
}
}
Достаточно ли этого, чтобы убедиться, что путь, отправленный пользователем, безопасен, или есть другие вещи, которые я должен сделать для защиты от атаки?
Решение
Может быть , что realpath()
это полезно для вас.
realpath()
расширяет все символические ссылки и разрешает ссылки на'/./'
,'/../'
и дополнительные'/'
символы в пути ввода и возвращает канонизированное абсолютное имя пути.
Однако эта функция предполагает, что рассматриваемый путь действительно существует.Он не будет выполнять канонизацию для несуществующего пути.В этом случае возвращается значение FALSE.