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.
您可以使用realpath解析绝对路径的相对路径,然后检查该路径是否以"root"文件夹的路径开头:
$absolutePath = realpath(__DIR__ . '/' . trim($searchStatement, '/'));
if (strpos($absolutePath, __DIR__ .'/') !== 0) {
die('Access denied.');
}
Run Code Online (Sandbox Code Playgroud)