从上面的webscope获取内容(图像)

时间:2010-08-11 15:20:58

标签: php image

我正在创建一个在线服务,“特殊用户”可以上传他们的图像。除了上传图像的用户之外,图像不会暴露给任何人,这一点非常重要。我听说保护图像的最佳方法是将它们放在腹镜上。

到目前为止一切顺利。

我的问题是我无法显示图像,这是怎么做到的?该应用程序是用PHP编写的,目录结构如下:

    /                    # this is where i placed the images
    /www
    /www/domain.com/     # This is the root of the website

我已经提供了一个测试脚本来检索带有此代码的图像

    header('Content-type: image/jpeg');
    $image = imagecreatefromjpeg( realpath('../../image.jpg'));
    imagejpeg($image);
    imagedestroy($image);

将图像传送到显示它的文件

    <img src="retrieve-image.php" />

有谁能告诉我我做错了什么?是不是设置错误的php.ini?有没有更简单的方法来保护图像?

提前致谢!!

// Mathias Bak

P.S。我如何以正确的方式在我的帖子中编写代码?

2 个答案:

答案 0 :(得分:1)

你要检索错误的图像。没有理由将JPEG解码为内存中的原始位图(imagecreatefromjpeg(),如果原始图像很大,可能会吸入大量内存),重新压缩它(imagejpeg()所有的当你需要做的只是将字节复制过来时,它会带来损耗和CPU开销。

假设您希望为多个不同的用户上传多个图像的功能,您需要某种方法来识别用户想要的图像,这可以通过在数据库中记录上传并为其分配唯一ID来最简单地完成每。在这里有很多其他的答案,如何做到这一点,所以我不打算重新讨论它。

您的查看脚本会包含以下内容:

<img src="retrieve-image.php?imageID=123" />

retrieve-image.php看起来像是:

<?php

function is_user_allowed_to_see($imageID) {
   // figure out if user is allowed to see the specified image
}

if (is_user_allowed_to_see_this($_GET['imageID'])) {
    readfile("/www/uploads/domain.com/" . $_GET['imageID']);
} else {
    readfile("/www/domain.com/sorry-not-allowed.jpg");
}

readfile()是通过PHP将文件流式传输给用户的首选方式。它将负责读取文件的内容并以不超过脚本内存限制的块的形式发送到浏览器。

由于您将图片数据直接加载到<img>标记中,因此您无法输出明文“抱歉,不允许看到此内容”文字,因为它是无效图片而您是'我只是得到破碎的图片图标。因此,如果用户不被允许,请发送包含文本/图像(例如,红色斜线圈)的图像,而不是实际图像。

答案 1 :(得分:0)

为什么不使用登录机制来验证是否允许某人访问该图像? 这很容易做到,安全性很高。