gpt4 book ai didi

php - 测试一个目录是否是另一个文件夹的子目录

转载 作者:可可西里 更新时间:2023-11-01 13:48:51 24 4
gpt4 key购买 nike

我正在尝试创建一个函数来阻止对我的一些低级目录的访问。例如,在构建我的网站时,如果我在编码时出错,我不想让上传的文件低于/var/www/html/site/uploads/。这也有助于防止在删除缓存文件或其他内容时出现目录删除错字。

这很容易用 realpath() 完成和 strcasecmp()。

问题是我不能使用 realpath() 生成绝对路径,因为任何使用不存在的目录调用此函数都将返回 FALSE。以下是我查看路径以验证它们的最佳尝试。

function is_sub_dir($path = NULL, $parent_folder = NULL) {

//Convert both to real paths
//Fails if they both don't exist
//$path = realpath($path);
//$parent_folder = realpath($parent_folder);

//Neither path is valid
if( !$path OR !$parent_folder ) {
return FALSE;
}

//Standarize the paths
$path = str_replace('\\', '/', $path);
$parent_folder = str_replace('\\', '/', $parent_folder);

//Any evil parent directory requests?
if(strpos($path, '/..') !== FALSE) {
return FALSE;
}

//If the path is greater
if( strcasecmp($path, $parent_folder) > 0 ) {
return $path;
}

return FALSE;
}

//BAD FOLDER!!!
var_dump(is_sub_dir('/var/www/html/site/uploads/../', '/var/www/html/site/uploads/'));

有谁知道如何正确放置文件路径 block 以防止低级文件夹访问?

:更新:

我想进一步解释一下,这种检查方法将用于多个服务器以及创建高于给定目录的目录。

例如,在我的上传目录中,我希望允许管理员创建新的子目录,例如 ...uploads/sub/。通过找出一种可靠的方法来确保给定的目录 实际上比父目录高 - 让我的管理员使用上传文件夹中的文件系统,我会感到更安全。

因为我可能需要在创建它之前验证 uploads/sub 是否高于 uploads/ 我不能使用 realpath() 因为 uploads/sub 不再存在。

至于由 PHP 动态计算的上传文件夹的实际位置。

define('UPLOAD_PATH', realpath(dirname(__FILE__)));

:更新 2:

我有一个想法,如果我使用 realpath 来比较整个路径减去最后一个目录段会怎么样。那么即使仍然需要创建最后一个目录段 - 路径的其余部分也可以强制匹配最小父目录?

最佳答案

不是您直接问题的答案,但您应该永远在真实的安全环境中使用黑名单。

那是因为您可能更改目录布局但忘记更新黑名单,从而使您的安全性无能为力。

使用白名单,您可以列出允许他们上传的位置。如果您随后更改布局而忘记更改白名单,您的安全性实际上增加,而不是减少。用户的抗议声会提醒您注意自己的健忘。

就禁止访问较低级别的目录而言,我认为获取真实路径很简单(所有这些 ./../\\ 转换为规范化形式)然后,如果它以 /var/www/html/site/uploads/ 开头,如果还有 则失败/ 之后的字符。

我以前做过这个规范化,它基本上包括(根据内存):

  1. 将所有 \\ 替换为 /(因此它使用 UNIX-isms)。
  2. 如果它不是以 / 开头,请在前面添加您的基本目录(因此它始终是绝对路径)。
  3. 将所有 /./ 替换为 /(摆脱无用的“留在当前目录”移动)。
  4. 将所有 /X/../ 替换为 /,其中 X 是任何非 / 字符(去掉 down-up 目录移动)。
  5. 然后确保它是一个有效的位置。

剩下的通常可以安全使用,尽管可能有一些边缘情况取决于是否有更多可用的目录移动命令(我已经看到 ... 等同于 ../..).您的里程可能会有所不同。

关于php - 测试一个目录是否是另一个文件夹的子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1628699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com