gpt4 book ai didi

php - 如何确保文件路径位于给定的子目录中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:55:36 25 4
gpt4 key购买 nike

我想确保通过查询字符串设置的文件路径不会超出所需的子目录。现在,我正在检查:

  1. 路径不以“/”开头,防止用户给出绝对路径。
  2. 路径不包含“..”,以防止用户提供所需子目录之外的路径。
  3. 路径不包含“:”,以防止使用 url(即“http://”、“ftp://”等)。如果我曾经在 Windows 服务器上运行此脚本(不太可能),这也会阻止以驱动器说明符(即“C:\”)开头的绝对路径。注意:我知道冒号在 Unix 文件名中是有效字符,但我绝不会在文件名中使用它。
  4. 路径不以“\”开头。以防万一我改变主意在 Windows 服务器上运行,这会阻止指定 Windows 网络路径(即“\\someserver\someshare”)。同样,我知道反斜杠是有效的 Unix 文件名字符,但我也不会在任何文件名中使用它。

这些检查是否足够?

背景

我有一个 PHP 脚本,它获取(通过查询字符串)要向用户显示的示例源文件的路径。所以我可能会给他们一个链接,例如“view_sample.php?path=accounting_app/report_view.php”或“view_sample.php?path=ajax_demo/get_info.js”。

脚本基本上是这样的:

$path = $_GET['path'];
if(path_is_valid($path) && is_file("sample/$path"))
{
header('Content-Type: text/plain');
readfile("sample/$path");
}

我担心恶意用户会看到该 url 并尝试执行类似“view_sample.php?path=../../database/connection_info.php”的操作并获得对一个在“sample”目录中的文件。

我上面定义的四项检查(将在 path_is_valid() 函数中实现)是否足以锁定恶意用户? (此外,我认为检查 1、3 和 4 基本上是无关紧要的,因为我在前面加上了相对路径,但如果我不这样做,检查就足够了吗?)

最佳答案

打电话

$path = realpath("sample/$path");

然后检查生成的路径是否以您期望的目录开头。

关于php - 如何确保文件路径位于给定的子目录中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456546/

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