【问题标题】:how to secure member photos for high-traffic website如何保护高流量网站的会员照片
【发布时间】:2011-04-03 05:20:25
【问题描述】:

在一个实际项目(约会网站)上,我有以下场景:

会员可以上传照片(主要配置文件)并创建相册并将照片分配给它。现在会员可以选择只允许注册会员、高级会员或他收藏的会员访问相册。

最简单的解决方案是隐藏相册,但如果有访问权限的人将 src url 发布到照片上,那么所有拥有该 url 的人都可以访问它。

我看到 flickr 和 facebook 以一种很好的方式保护它们,但我如何实现它而不需要多次查询数据库并复制用户身份验证/会话。照片将存储在自己的服务器上(varnish/nginx)。

有没有人知道如何在高流量的情况下做到这一点并尽可能减少资源的使用?

解决方案需要能够处理实际的 2000 万成员和大约 3000 万张照片。

【问题讨论】:

  • ircmaxell 的回答是一个好办法,但我有一个安全问题。现在所有媒体都将放在同一个文件夹结构中带有 domain.xx/folder/filename.ext 的文件,因为在成员将一些隐私选项设置到另一个文件夹后我无法移动媒体,任何周转我该怎么做?

标签: php security photo


【解决方案1】:

最好的解决方案是将图像存储在服务器的 Web 可访问部分之外。然后,您将引用指向图像的 php 页面,而不是直接引用照片:

http://www.example.com/image.php?imageid=1234567

然后在您的 php 脚本中,您可以检查登录的用户是否可以访问该照片,如果可以,您可以在响应中将图像流式传输给该用户。

【讨论】:

  • QA 已经了解了这么多。他在问如何优化它。
  • @Kibee - 这样会占用太多资源并且对我们不可用。这个想法是能够使用一些安全密钥和/或 memcached 存储的一些信息来处理照片服务器上的身份验证,但我不知道 flickr/facebook 是如何做到这一点的。
  • 如果您可以在不查看实际 PHP 会话信息的情况下访问照片,那么就无法阻止用户获取 URL 并将其发布到其他地方。从 facebook 来看,看起来他们只是为每张照片使用了一个非常长的、难以猜测的 URL。如果您从 facebook 获取照片 URL,并将其发布到您未登录 facebook 的浏览器中,您仍然可以访问该照片。
  • 我认为 facebook 实施了一些安全措施,但我错了,这是无法做到的,但 Flickr 和其他图片托管网站为访问权限有限的照片实施了一些解决方案,问题只是如何他们已经这样做了:-)
【解决方案2】:

作为一个想法...

您可以创建一个映射表,您可以在其中“准备”基于收藏夹、朋友等对用户->照片的访问权限。

然后您根据这些权限返回图像,但按用户缓存。这将减轻服务器的压力,但由于缓存超时,应用限制会有一些延迟。

【讨论】:

  • 问题将出在处理上,如果我理解正确,您将存储用户和访问每个照片对象之间的信息,这将导致许多记录(该网站有 2000 万成员和 3000 万张照片)使其难以更新和存储。
  • 好的,那就放下这部分。提示是缓存图像结果,但会因用户而异。如果你的框架支持这个。
  • 我仍然认为那样使用了太多资源。我们为这个项目使用了一个自定义框架,因此我们可以完全适应我们的需求。
【解决方案3】:

嗯,一种可能性是运行类似Lighttpd's mod_secdownload 的东西。

基本上你在配置部分设置了一个“秘密”字符串。然后,当您生成链接时,它不是指向资源的链接,而是临时链接(因此它仅对$x 秒数有效)。这样,用户需要再次访问该页面(并因此再次通过访问控制)才能被允许查看该图像...

Apache 有一个类似的模块:mod_auth_token...

【讨论】:

  • ircmaxell - 我会记住这个解决方案,我希望它适用于我们显示的带有 img src 标签的照片。
  • 应该的。如果时间已经过去,它将简单地返回 403 Forbidden(如果令牌无效)、如果达到超时则返回 410 Gone 或如果没有文件则返回 404...所以它应该 针对您的具体情况的帮助...是的,生成的 url 可以直接在图像标签中使用。它将以与 /path/to/image.gif 相同的方式解决,但具有相同的标头。唯一的区别是网址会在一定时间后过期……
  • 我将尝试使用此解决方案进行一些测试,我看到 nginx 使用 ngx_http_secure_download_module 提供了类似的功能,现在我希望使用它不会有太大的性能损失。我看到的唯一问题是 nginx 要求一个文件夹来存放受保护的东西,因为我们所有的文件都存储在相同的结构中,我实际上没有看到如何使用它的解决方案。成员需要可以在网络应用程序上更改他们想要的权限,并且无法在照片存储服务器上进行任何文件移动。
  • 很好的答案,很高兴知道这些东西。
猜你喜欢
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
相关资源
最近更新 更多