阻止/ ..用户输入

spe*_*ndo 2 php unix linux validation

我在一个文件夹中有一个php脚本(我称之为根文件夹).该脚本基本上可以列出此根文件夹的子文件夹中的所有文件.用户可以使用GET参数指定应显示哪个子文件夹.

script.php?foo
Run Code Online (Sandbox Code Playgroud)

会显示的内容

<root folder>/foo/
Run Code Online (Sandbox Code Playgroud)

和script.php?.bar会显示内容

<root folder>/.bar/
Run Code Online (Sandbox Code Playgroud)

但是,用户也可以"欺骗"并使用命令/..来显示他们无法看到的文件夹的内容.

例如用

script.php?/../..
Run Code Online (Sandbox Code Playgroud)

用户可以在文件夹层次结构中变得非常高.

你有一个想法如何防止用户做这样的"作弊".

为简单起见,假设存储了GET参数$searchStatement.

Nik*_*iko 5

您可以使用realpath解析绝对路径的相对路径,然后检查该路径是否以"root"文件夹的路径开头:

$absolutePath = realpath(__DIR__ . '/' . trim($searchStatement, '/'));

if (strpos($absolutePath, __DIR__ .'/') !== 0) {
    die('Access denied.');
}
Run Code Online (Sandbox Code Playgroud)