我想允许用户使用GET参数读取其目录(和子目录)中的文件。我必须保护这部分代码,因此它们不能进入带有两个点的上层目录。够了吗?
$filePath = $userDir . '/' . str_replace( '..', '', $_GET['path'] );
if(!is_file($filePath)) {
die();
}
readfile($filePath);
答案 0 :(得分:-1)
在这里要小心!
即使您替换“ ../”和“ .. \”,也要确保您递归。因为如果您不这样做,恶意用户可以提交以下内容来绕过您的安全性:
“ ... /。/”
$path = '..././';
var_dump(str_replace('../', '', $path));
// string(3) "../"
在这里看到问题了吗?
您可以使用do / while循环以安全的方式清理用户输入:
$path = '..././';
do {
$path = str_replace(['../', '..\\'], '', $path, $count);
} while ($count > 0);
var_dump($path);
// string(0) ""
但是我和乔恩在一起。允许这样做通常不是一个好主意,并尽可能避免这样做。尽可能限制文件名。始终在用户路径前添加路径,而不是通过URL参数传递完整路径。