我有一个小问题,我试图在我的PHP应用程序中创建一个简单的安全检查。
为了便于讨论,我们假设我有以下文件夹结构:
website home (httpdocs)
|_file_1
|_file_2
|
|_DIR_1
| |_file_3
| |_file_4
|
|_DIR_2
| |_something.php
| |_file_5
|
|_public
|_index.php
在这个例子中,我们假设用户可以访问/DIR_2/something.php
(尽管请求将通过/public/index.php
路由),也可以在url中提供一个参数,例如?get_file=file_5
。通常只有DIR_2
是公共可访问的,位于public/index.php
内部的路由器将处理文件阅读并返回带有正确头的输出。
现在让我们假设用户提供了以下url /DIR_2/something.php?get_file=../DIR_1/file_3
。代码将执行它而不会出现任何问题,但会存在安全风险,因为只有DIR_2应该是可访问的。
所以,我的问题是:是否有PHP函数可以用来检查文件(或目录)的路径是否指向特定目录之外,例如
$filePath = $_GET['get_file'];
if(file_outside(__DIR__, $filePath)){
echo "file is outside the dir";
} else {
echo "file is inside the dir";
}
我试过搜索,但不幸的是,所有的结果都是关于检查路径是否是一个文件或目录,或文件是否存在,这不是我需要的。
我使用php8.0以防万一它是重要的。
1条答案
按热度按时间p4rjhz4m1#
如中所述:https://stackoverflow.com/a/4205278/12250388
应该使用
realpath()
函数来获取文件的真实的路径,然后将其与预期文件所在目录的路径进行比较。非常感谢@ChrisHass把我推向了正确的方向。