【发布时间】:2010-10-02 04:13:12
【问题描述】:
我想确保通过查询字符串设置的文件路径不会超出所需的子目录。现在,我正在检查:
- 路径不以“
/”开头,防止用户给出绝对路径。 - 路径不包含“
..”,以防止用户提供位于所需子目录之外的路径。 - 路径不包含“
:”,以防止使用url(即“http://”、“ftp://”等)。如果我曾经在 Windows 服务器上运行此脚本(不太可能),这也将阻止以驱动器说明符开头的绝对路径(即“C:\”)。注意:我知道冒号是 Unix 文件名中的有效字符,但我永远不会在文件名中使用它。 - 路径不以“
\”开头。以防万一我改变主意在 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");
}
我担心恶意用户会看到该网址并尝试执行“view_sample.php?path=../../database/connection_info.php”之类的操作并获得对“示例”目录中不的文件的访问权限。
我上面定义的四项检查(将在path_is_valid() 函数中实现)是否足以锁定恶意用户? (另外,我认为检查 1、3 和 4 基本上是无关紧要的,因为我预先添加了一个相对路径,但如果我不这样做,检查就足够了吗?)
【问题讨论】:
标签: php security sanitization