检查路径是否解析为 PHP 脚本的子文件夹

Check if path resolves to a subfolder of the PHP script

提问人:GrahamS 提问时间:11/9/2023 更新时间:11/9/2023 访问量:24

问:

我们有一个站点,它使用 RewriteRule 将对文件夹的请求更改为对example.org/home/products/widgets/example.org/home/index.php?path=/products/widgets/

该规则如下所示:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} -d
  RewriteRule ^(.+)/$ ./index.php?path=$1 [NC,QSD,NS]
</IfModule>

然后列出真正位于该文件夹位置的各种文件的详细信息。 (即 存在并包含文件,但我希望将文件夹的请求重定向到索引 .php)index.php/home/products/widgets/

这有效,但我的问题是:如何可靠地检测/防止某人恶意使用它来访问不是子文件夹的其他文件夹?/home/

现在有人可以偷偷地要求example.org/home/index.php?path=/products/../../secretstuff

我是否需要在 PHP 中使用 realpath() 做一些事情,或者这是我可以在 ?mod_rewrite

php mod-重写

评论

1赞 CBroe 11/9/2023
你应该在PHP中处理这个问题。假设您的内部 URL 格式已知/由于其他地方的一些错误而暴露,我可以直接在浏览器中请求,甚至不需要您当前的重写设置。您必须编写一组额外的 RewriteCond(s)/RewriteRule,用于验证查询字符串内容,以防止我这样做/home/index.php?path=/any/path/i/like
0赞 GrahamS 11/9/2023
谢谢@CBroe这是我的怀疑。我只是不确定mod_rewrite是否有某种方法可以处理我错过的。所以我想这实际上是一个关于如何在 PHP 中最好地处理它的问题。
1赞 CBroe 11/9/2023
用于解决任何问题,以便您拥有完整的绝对文件系统路径。然后,只需检查该值是否以要限制其的文件夹的完整绝对文件系统路径开头(包括尾部斜杠)。realpath../
0赞 GrahamS 11/9/2023
谢谢@CBroe,我找到了一个类似的答案,所以我将关闭这个答案。
1赞 Chris Haas 11/9/2023
您可能还想考虑一下,并使用 完全避免 QS。我认为所有遍历攻击都会因此而得到缓解。FallBackResource$_SERVER['REQUEST_URI']

答: 暂无答案