限制访问我的网站上的图像,除非通过我自己的htmls

时间:2009-10-26 06:06:15

标签: php python linux perl

在我的网站上,我以简单的方式存储用户图片,例如: “图像/ user_1.jpg”。

我不希望访问者只是通过尝试user_ids来查看我的服务器上的图像。 (例如:www.mydomain.com/images/user_2.jpg,www.mydomain.com/images/user_3.jpg,等等......)

到目前为止,我有三个解决方案:

  1. 我尝试使用.htaccess来密码保护“images”文件夹。这有点帮助我达到某种程度,但有些图像开始在我的htmls上弹出用户名和密码请求(虽然令人惊讶的是一些图像没有)所以这似乎是一种不可预测的方法。

  2. 我可以开始将我的user_id转换为带有盐的md5哈希。图像将命名为:/image/user_e4d909c290d0fb1ca068ffaddf22cbd0.jpg。我不喜欢这个解决方案。它使文件系统变得复杂。

  3. 或者我可以使用PHP的readfile()函数,或者在Perl或Python中使用类似的东西。例如,我可以使用md5字符串传递密码,以验证访问者是否具有访问该图像的登录用户。

  4. 我倾向于选项3但是使用Perl或Python角度(假设它们比PHP更快)。不过,我想就此事看到其他想法。也许这有一个简单的.htaccess技巧?

    基本上我只想确保没有人可以从我的网站查看图像,除非图像是从我网站上托管的htmls中直接调用的。

    非常感谢,

    Haluk

5 个答案:

答案 0 :(得分:6)

您选择用于确定请求来源的任何方法都只能与用户浏览器发送的HTTP_REFERER信息一样可靠,但这并不是很好。要求身份验证是保护内容的唯一好方法。

答案 1 :(得分:5)

方法#1不可行,因为它会在请求的每个图像上询问用户名和密码。由于缓存问题,您可能会提示某些图像而不是其他图像。

方法#2看起来对我来说最吸引人的是处理器密集程度最低,但只有user_id通过md5函数传递,文件名仍然很容易猜到。您应该选择md5('我的秘密字符串'。$ user_id)以获得更好的解决方案。

你为什么要通过Perl或Python选择#3? PHP的速度有什么问题?事实上,如果你以这种方式保护你的图像,你应该花费额外的时间将它们移出你的webroot,这样它们只能通过你的脚本访问,首先检查用户是否经过身份验证,然后通过阅读它来传递头像并输出它。或者,您可以使用htaccess文件保护目录deny from all

另外,您应该通过PHP或via .htaccess来获取HTTP_REFERER安全性。

祝你好运!

答案 2 :(得分:3)

您可以通过htaccess查找“Hotlinking prevention”,我认为这应该是您需要的保护类型的简单解决方案。然而,它不是万无一失的,真正想要获得这些图像的人会通过伪造推荐人来找到解决方法。

http://altlab.com/htaccess_tutorial.html

答案 3 :(得分:2)

你正在考虑选项#3。使用将验证user和readfile()图像的服务脚本。在提供图像之前,请务必通过header()函数设置正确的Content-Type HTTP标头。为了更好的隔离,图像应放在Web根目录之上,或者由编写良好的.htaccess规则保护 - 绝对有一种以这种方式保护文件和/或目录的方法。

答案 4 :(得分:0)

正如所说的那样,热链接保护不会仅通过更改其ID来保护您的文件不被列入。 Plus Refferer可以很容易伪造。

在这种情况下,我会建议某种身份验证。您必须创建仅在通过COOKIES或SESSION验证登录用户时才提供图像的PHP脚本。 (我不建议使用md5的用户密码。)

也许你需要一些SQL表来保存访问权限。

哦,为了保护您的图像,您只需将.htaccess与

放在一起
deny from all

到images文件夹。