限制访问网站上的图像
Posted
技术标签:
【中文标题】限制访问网站上的图像【英文标题】:Restricting access to images on a website 【发布时间】:2010-11-15 04:45:16 【问题描述】:我正在建立一个投资组合网站,其中包含许多图片,其中一些我不希望公众看到。我想我会通过电子邮件向某人发送用户名和密码,他们可以使用它们“登录”来查看我的工作。
我在网上看到了各种“隐藏图像”问题的解决方案,包括以下使用 php 的 readfile 的解决方案。我还看到另一个使用 .htaccess。
Use php's readfile() or redirect to display a image file?
我对 readfile 解决方案并不着迷,因为加载图像似乎很慢,我希望能够使用 Cabel Sasser 的 FancyZoom,它需要不受限制地访问图像,(他的库需要一个链接到完整大小的图像),因此排除了 .htaccess。
回顾一下我正在尝试做的事情:
1) 提供一个网站,让用户能够在其中验证自己是否是我想查看我的图像的人。 2) 限制随机网络用户看到这些图像。 3) 使用 FancyZoom 放大缩略图。
我不在乎最终会使用什么技术——javascript、PHP 等——无论是最干净、最简单的。
顺便说一句,我是 Java 开发人员,而不是 Web 开发人员,所以我可能没有正确考虑这个问题。
【问题讨论】:
readfile 的性能不会成为问题,除非您要发送大量图像。对于投资组合网站来说完全没问题。 【参考方案1】:使用 .htaccess 应该是最安全/最简单的方法,因为它内置于网络服务器本身的功能中。
【讨论】:
我不想使用 Auth 指令,因为它们会弹出一个对话框。我研究了使用以下内容:[code start] SetEnvIf Referer "mydomain.com" ALLOW_ACCESS Deny from all Allow from env=ALLOW_ACCESS [code end] 但是 FancyZoom 图像请求未能通过 SetEnvIf。【参考方案2】:而不是提供图像的链接。提供指向 cgi 脚本的链接,该脚本将自动提供正确的图像标题和内容。
例如: image.php?sample.jpg
然后,您可以确保它们已作为链接的一部分进行身份验证(例如,传递会话 ID)。
这将是标题的一部分,然后您的图像数据可以跟随。
header('Content-Type: image/jpeg');
编辑:如果它必须要快,你可以用 C/C++ 而不是 php 来编写。
【讨论】:
对,这基本上是readfile的解决方案。我没有意识到我可以在包装我的图像的 a 的 href 中传递 image.php?sample.jpg(FancyZoom 期望缩略图图像由指向全尺寸图像的链接包裹。传递 image.php? href 中的 full_size_sample.jpg 可以解决问题!谢谢。 如果您自己进行此操作,请务必小心不要暴露系统上的所有数据以及使得执行 XSS 攻击变得相当容易。如果您要这样做,可能的文件的白名单是最安全的方法。 你能告诉 MERN 堆栈网站的类似解决方案吗?【参考方案3】:我不知道它是否符合您的需求,但我通过使用 TinyWebGallery 解决了一个类似的问题(给受限人群提供图片),这是一个小型图库应用程序 没有数据库。
您可以允许通过密码访问不同的目录,并且可以将图片直接上传到文件系统,因为 TinyWebGallery 会即时检查新的目录/图片。它将生成缩略图并让用户可以对图片进行评分/评论(您可以禁用此功能)。
这不是最小的工具,但是我认为它比使用 apache 指令更容易设置,而且它看起来更好作为 裸图像。
【讨论】:
【参考方案4】:如果您使用的是nginx,则可以使用Secure Link module。
【讨论】:
以上是关于限制访问网站上的图像的主要内容,如果未能解决你的问题,请参考以下文章
在不将 ip 列入白名单的情况下限制对 S3 托管网站的访问