【发布时间】:2015-02-21 04:24:01
【问题描述】:
我有一个名为 gallery.php 的 php 文件,它是用户特定图片库的页面。为安全起见,用户图像存储在 Web 根目录之外。
为了为每个用户检索适当的文件,我使用了一个 getimage.php 文件,该文件从他们的位置提供图像。总而言之,目录结构是这样的:
- 用户图像
- 用户 1
- user1 的图片列表
- 用户 2
- user2 的图片列表
- 用户 1
- 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,但我确信此脚本可能不包含其他攻击途径。
出于这个原因,如果我可以将 getimage.php 移到 webroot 之外,或者至少阻止它被直接访问(并且只能通过 gallery.php,发送的 img 参数在我的控制之下),我更愿意.
每当我尝试将 getimage.php 移出 public_html 时,即使我在gallery.php 中执行要求或包含,我似乎也无法再调用它。我访问 getimage.php 的方式是这样做的:
<img src=getimage.php?img=IMG_FILENAME.jpg />
但如果我将 getimage.php 移出 public_html 目录,它会失败。
所以,长话短说:我需要做些什么来防止 getimage.php 被滥用?
【问题讨论】:
-
因为图像要在网络上提供,我不认为将它们存储在网络根目录之外是一个好主意,因为为了提供它们,无论如何你都需要创建一个安全漏洞。相反,我会验证上传的文件是否真的是图像,然后让它们可以访问网络。 stackoverflow.com/questions/6755192/…
-
我不需要上传检查,因为提供的文件都是我自己制作的。用户只需要能够看到它们。如果我要将用户图像放在 web 根目录中,如何防止除 User1 之外的任何人访问 User1 的文件?
-
我对为什么需要保护某些图像感到困惑。对我来说,您的脚本似乎是这里的问题。为什么不将您的图像移动到子域(与您的应用程序完全分开)并从那里提供它们?
-
如何通过知道他人图像文件的 URL 来防止未经授权的用户访问他们不应该访问的图像?
标签: php html image .htaccess security