繁体   English   中英

PHP Realpath无法正常工作以防止目录遍历

[英]PHP realpath not working to prevent directory traversal

我收到了其他人的系统代码,该系统在浏览器中显示包含照片的文件夹。

例如,这是网站上可能的网址:

gallery.php?action=view&folder=Cars

目前,您可以用../../../../../替换“汽车”,这将很高兴地显示Linux根文件夹。 幸运的是,该网站目前处于离线状态。

我尝试使用realpath修复此问题。 这是我到目前为止的内容:

case 'view' :
$name = realpath(dirname(__FILE__) . "/Content/Gallery/" . $_GET['folder']);

echo $name;

$data = $file->getPictures($name);
require 'Views/Gallery.view.php';
break;

我在第三行添加了echo,以查看URL是什么。 在上面的网址中,一切都很好,echo输出如下:

/var/www/Content/Gallery/Cars 

到现在为止还挺好。 但是,如果我输入/../../../../../../../../而不是“ Cars”,则$ name变为/,并且页面仍显示根文件夹。 英语不是我的母语,所以我可能会误解realpath的工作原理或作用。 据我了解,它从给定URL中删除任何../实例。

有人可以告诉我我在做什么错吗?

realpath()不足以解决目录遍历。

您所描述的是它的设计意图:它将诸如../相对内容转换为实际的目录路径。

但是,为了安全起见,您可以采用realpath() ed路径,看看它是否仍然是安全基本路径的子代。 如果不是,则有人尝试潜入一个他们没有业务的目录:

 $name = realpath(dirname(__FILE__) . "/Content/Gallery/" . $_GET['folder']);

 // The safe root directory. 
 $safe_root = dirname(__FILE__) . "/Content/Gallery/";

 // Check whether realpath() result is still inside /Content/Gallery
 if (substr($name, 0, strlen($safe_root)) != $safe_root) 
   die ("Possible directory traversal attack");

据我了解,它从给定URL中删除任何../实例。

不,那不是它的作用。 不是用于URL,而是用于路径。 它只是转换路径,然后将../扩展到正确的文件夹中。 它不会删除它们,而是解决它们-这意味着它将计算../所代表的内容并更改具有该内容的路径。

在Windows上,它也将/更改为\\。

真实路径

realpath()扩展所有符号链接,并解析对输入路径中“ /./”、“/../”和多余的“ /”字符的引用,并返回规范化的绝对​​路径名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM