保护图像 - php base64 vs readfile

时间:2011-08-05 00:04:34

标签: php

现在我正在使用base64来控制谁可以访问我网站上的图像。我将这些图像存储在webroot目录之外,因此没有人可以直接访问它们。然后,我根据他们在postgresql数据库中访问的记录来确定谁可以访问这些图像。基本上如果他们可以查询记录“a”,那么他们就可以看到图片“a”。

if (file_exists($pic)) {
    $imgbinary = fread(fopen($pic, "r"), filesize($pic));
    $picbase64 = "data:image/gif;base64," . base64_encode($imgbinary);
    echo('<img src="' . $picbase64 . '" />');

如何在保持安全性的同时使用readfile而不是base64?例如,当使用readfile方法将图像传递给客户端浏览器时,这需要我使用$_GET方法将变量发送到具有readfile和header类型的php脚本,然后在客户端上显示图像浏览器。问题是任何人都可以查看html源代码并查看<img src=phpscript.php?imagename=foo.jpg />,然后使用他们喜欢的任何参数http://www.hostname/phpscript.php?imagename=bar.jpg在浏览器中调用脚本。使用base64方法,我目前正在使用这种方法是不可能的,因为我不需要单独的脚本来处理带有$_GET参数的图像,而是将图像直接嵌入到html页面中。

感谢您的帮助!

CNC中 对不起,我没有提到允许匿名访问,某些信息是公开的。这意味着如果您未经过身份验证并且您可以阅读记录“a”,则还可以看到图像“a”。

2 个答案:

答案 0 :(得分:2)

您现在正在做的事情与您需要做的事情之间的实质性区别是通过多个请求发送文件。这需要在请求之间验证或以其他方式记住用户。

你现在拥有的是:

if (file_exists($pic)) {
    // do stuff
}

你需要的是:

if (file_exists($pic) && user_has_image_permission($pic)) {
    // do stuff
}

因此,您需要了解的细节是user_has_image_permission()函数背后的逻辑。

如果您需要这是安全的,我倾向于使用sessions来解决此问题,但您也可以使用cookies

如果您不介意交易某些安全性以获得一些简单性,您可以使用某种“url密码短语”,就像那些常用于共享Web服务中的文档和文件的那些,例如“有链接的任何人” Google文档,AWS,私人RSS Feed等。

最后,基于http身份验证,您可以完全使用PHP之外的解决方案。在Apache中,它采用Access Control

的形式

答案 1 :(得分:0)

我同意;使用cookie检查访问权限将是最直接的方式。如果您希望加快速度,请搜索X-Sendfile。一旦经过身份验证,它就可以将文件传输卸载到您的Web服务器。它内置于lighttpd,并且有一个apache mod,https://tn123.org/mod_xsendfile/