[英]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.