str_replace函数是否足以保护此代码?

时间:2019-01-03 10:24:18

标签: php security

我想允许用户使用GET参数读取其目录(和子目录)中的文件。我必须保护这部分代码,因此它们不能进入带有两个点的上层目录。够了吗?

$filePath = $userDir . '/' . str_replace( '..', '', $_GET['path'] );

if(!is_file($filePath)) {
    die();
}

readfile($filePath);

1 个答案:

答案 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参数传递完整路径。