微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP – 访问Web根目录之外的文件的安全性

我有一个名为gallery.PHPPHP文件,它是用户特定图像库的页面.为了安全起见,用户图像存储在Web根目录之外.

要为每个用户检索适当的文件,我使用getimage.PHP文件,该文件从其位置提供图像.总而言之,目录结构如下所示:

> UserImages

> User1

> user1的图像列表

>用户2

> user2的图像列表

> public_html

> gallery.PHP
> getimage.PHP

getimage.PHP编写如下:

$imgString = realpath('/UserImages/' . $_SESSION['username'] . '/' . $_GET['img']);
if (!startsWith($imgString, '/UserImages/' . $_SESSION['username'] . '/')
    || !(endsWith(strtolower($imgString), '.jpg') || endsWith(strtolower($imgString), '.jpeg')))
{
    header('HTTP/1.0 403 Forbidden');
    die();
}

$img = file_get_contents($imgString);
header("Content-type: image/jpeg");
echo($img);
exit();

我依靠$_GET [‘img’]来确定要检索的图像,这是一个可能的安全漏洞(也是一个主要漏洞).我可以预见目录遍历攻击,因此使用realpath,虽然我确信可以有其他攻击途径,我不包含此脚本.

出于这个原因,我更喜欢我可以在webroot之外移动getimage.PHP,或者至少阻止它直接访问(并且只能通过gallery.PHP,其中发送的img参数严格在我的控制之下).

每当我尝试移动public_html的getimage.PHP oustide时,即使我在gallery.PHP中执行require或include,我似乎也无法再调用它.我访问getimage.PHP的方式是这样做的:

<img src=getimage.PHP?img=IMG_FILENAME.jpg />

但如果我将它移出public_html目录,getimage.PHP将失败.

所以,长话短说:我需要做些什么才能防止getimage.PHP被滥用?

解决方法:

您需要允许Apache(假设)使用Directory指令(http://httpd.apache.org/docs/2.2/mod/core.html#directory)访问带有图像的文件夹.

或者,您可以在根目录下移动图像,并使用.htaccess限制对它们的直接访问,如果您想保护它们.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐