当前位置:  开发笔记 > 编程语言 > 正文

如何确保文件路径在给定的子目录中?

如何解决《如何确保文件路径在给定的子目录中?》经验,为你挑选了2个好方法。

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

    路径不以" /" 开头,以防止用户给出绝对路径.

    该路径不包含" ..",以防止用户提供所需子目录之外的路径.

    该路径不包含" :",以防止使用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"的操作,并获取对不在 "sample"目录中的文件的访问权限.

我在上面定义的四个检查(将在path_is_valid()功能中实现)是否足以锁定恶意用户?(另外,我认为支票1,3和4基本上是无关紧要的,因为我在前面设置相对路径,但是如果我不这样做,那么检查是否足够?)



1> sth..:

呼叫

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

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



2> Evan Fosmark..:

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有