我希望人们能够在有限的时间内访问图像。 他们支付x.jpg的例子,他们可以访问它,直到我决定 没有更多权限可以下载它。
注意:存储x.jpg的'images'服务器独立于'www'服务器,因此系统 可以轻松扩展。 (这两个服务器不共享数据,db访问权限等等......)
我到目前为止找到的最佳解决方案是:
在www服务器上,我生成一个包含两个参数的加密字符串: “filename”和“expiration_stmp”。我将此加密字符串传递给映像服务器上的脚本 解密它,检查过期的stmp是否过去,如果一切正常, 读取磁盘上的文件,输出正确的标题并将图像二进制数据输出到客户端。
所以我在www服务器上有这样的链接:“img src = http://IMAGES.myserver.com/get.php?XJDKUJHKDJSHJKDHJKHJKDJKDJKD” 解密时“XJDKUJHKDJSHJKDHJKHJKDJKDJKD”将提取到filename = x.jpg,expiration_stmp = 132920302030 图像服务器上的get.php将包含类似header的内容('Content-type ... bblablabl'); ReadFile的(x.jpg).....
我必须解决的问题是,当我生成加密字符串XJDKUJHKDJSHJKDHJKHJKDJKDJKD时, 我无法知道expiration_stmp,因为管理员可以在将来的任何时间(1分钟到5天)删除访问权限。 因此,当管理面板中的管理员删除了为该特定用户读取文件的权限时,必须拒绝该用户访问 到文件。
为了解决这个问题,我想到通过强制刷新页面每小时重新生成包含链接的页面,以生成新的加密字符串,其中包含有效最长1小时的新expiration_stmps。因此链接“img src = http://images.myserver.com/get.php?XJDKUJHKDJSHJKDHJKHJKDJKDJKD”仅在1小时内有效,因此当管理员取消用户的访问权限时,我只是拒绝重新生成新的加密的字符串,以便用户在最后生成的expiration_stmp到期后(最多1小时)不能再访问该文件。
现在这是我发现的最佳解决方案......我很想听到处理这种情况的想法或更好的方法吗?
感谢
答案 0 :(得分:0)
为什么您认为用户或会话限制不会扩展。您可能会生成访问代码而不是加密字符串。存储链接到您要服务的图像的DB中的访问代码,以及用户ID。如果管理员想要删除访问权限,只需删除该记录,或将其标记为已过期。数据库非常快,并且没有理由使用具有正确索引的数据库不能处理这个问题,即使扩展到数百万活动图像也是如此。
答案 1 :(得分:0)
最佳解决方案是在以下结构中使用数据库:
token:token将有一个userID字段,该字段将指向另一个表来存储用户的信息,一个图像ID将引用图像数据库中的图像,以及有效期和ID。
图片:它将具有ID,imagename
对于下载链接,您可以简单地执行:download.php?tokenID = xxx并且脚本将去检查过期日期是否过去,这将在用户点击时实时发生文件,所以你不会有未经授权的访问问题。检查到期后,您可以从令牌字段中获取imageID,并在另一台服务器上找到该图像。
您可以通过拥有一个或多个数据库服务器(我认为一个应该足够)来轻松扩展此结构,并将所有文件/脚本服务器连接到远程数据库服务器。
没有数据库,考虑到文件只能从GET变量中获取日期并且无法通过任何引用检查它是不可能的,如果您使用任何常见的PHP函数加密变量,系统应该很容易被破解