Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何保护高流量网站的会员照片_Php_Security_Photo - Fatal编程技术网

Php 如何保护高流量网站的会员照片

Php 如何保护高流量网站的会员照片,php,security,photo,Php,Security,Photo,在实际项目(约会网站)中,我有以下场景: 会员可以上传照片(主配置文件),创建相册并为其分配照片。现在,会员只能选择允许注册会员、高级会员或其收藏夹中的会员访问相册 最简单的解决方案是隐藏相册,但如果有人有权将src url发布到照片,则拥有该url的每个人都可以访问该相册 我看到flickr和facebook以一种很好的方式保护了它们,但我如何实现这一点,而不需要多次查询数据库并复制用户身份验证/会话。照片将存储在自己的服务器上(varnish/nginx) 考虑到高流量和尽可能少地使用资源,

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

会员可以上传照片(主配置文件),创建相册并为其分配照片。现在,会员只能选择允许注册会员、高级会员或其收藏夹中的会员访问相册

最简单的解决方案是隐藏相册,但如果有人有权将src url发布到照片,则拥有该url的每个人都可以访问该相册

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

考虑到高流量和尽可能少地使用资源,有人知道如何做到这一点吗


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

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

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

作为一个想法

您可以创建一个映射表,根据收藏夹、好友等“准备”pairs user->photo的访问权限


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

嗯,一种可能是运行类似的操作

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


Apache有一个类似的模块:…

QA已经了解了很多。他在问如何优化它。@Kibee-这种方式占用了太多的资源,对我们来说是不可用的。我们的想法是能够使用一些安全密钥和/或memcached存储的一些信息来处理照片服务器上的身份验证,但我不知道flickr/facebook是如何做到这一点的。如果您可以访问照片而不查看实际的PHP会话信息,那么就没有办法阻止用户获取URL并将其发布到其他地方。从facebook上看,他们似乎只是为每张照片使用了一个很长的不可用的URL。如果你从facebook上获取照片URL,并将其发布到未登录facebook的浏览器中,你仍然可以访问该照片。我认为facebook已经实施了一些安全措施,这是不可能的。我错了,但Flickr和其他图像托管网站已经为访问权限有限的照片实施了一些解决方案,问题只是他们如何做到这一点:-)问题在于处理,如果我理解正确,您将在用户和访问每个照片对象之间存储信息,这将导致许多记录(该网站有2000万成员和3000万照片),这使得更新和存储变得困难。好的,然后删除这部分。提示是缓存图像结果,但不同的缓存用户。如果你的框架支持这一点,我仍然认为这样会占用太多的资源。我们为这个项目使用了一个定制的框架,这样我们就可以完全适应我们的需要。ircmaxell-我会记住这个解决方案,我希望它能适用于我们用img src标签内联显示的照片。它应该可以。如果时间已经过去,它将简单地返回403禁止(如果令牌无效)、410消失(如果达到超时)或404(如果没有文件)。。。因此,它应该有助于您的具体情况。。。是的,生成的url可以直接用于图像标记中。它的解析方式与使用相同标题的
/path/to/image.gif
相同。唯一的区别是URL将在一段时间后过期…我将尝试使用此解决方案进行一些测试。我看到nginx在ngx_http_secure_download_模块中提供了非常好的功能。现在,我希望使用它不会造成太大的性能损失。我看到的唯一问题是,nginx要求为安全的东西提供一个文件夹,因为我们所有的文件都存储在同一个结构中,我看不到如何使用它的实际解决方案。会员需要更改他们在web应用程序上的权限,并且不可能在照片存储服务器上移动任何文件。回答很好,很高兴了解这些内容。ircmaxell的回答是一个好方法,但我有一个安全问题。所有媒体都将处于相同的文件夹结构。如果我想保护某些文件,我可以使用特殊的url,如:domain.xx/secure/hash/time/folder/filename.ext,但我的问题是,每个人都可以使用domain.xx/folder/filename.ext访问该文件,因为在成员将一些隐私选项设置为其他隐私选项后,我无法移动媒体文件夹,有什么转机吗?我怎么做?