php 如何检查文件/目录路径是否指向当前目录之外

ldioqlga  于 2022-10-30  发布在  PHP
关注(0)|答案(1)|浏览(234)

我有一个小问题,我试图在我的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以防万一它是重要的。

p4rjhz4m

p4rjhz4m1#

如中所述:https://stackoverflow.com/a/4205278/12250388
应该使用realpath()函数来获取文件的真实的路径,然后将其与预期文件所在目录的路径进行比较。
非常感谢@ChrisHass把我推向了正确的方向。

相关问题