【问题标题】:Give access to an image for a limited time until an admin removes the access right?在管理员删除访问权限之前授予对图像的访问权限?
【发布时间】:2011-11-28 02:25:44
【问题描述】:

我希望人们可以在有限的时间内访问图像。 例如,他们为 x.jpg 付费并且他们可以访问它,直到我决定他们 没有更多的权限下载它。

注意:存储 x.jpg 的“图像”服务器独立于“www”服务器,因此系统 可以轻松扩展。 (两台服务器不共享数据,db访问等等……)

目前我发现的最佳解决方案是这个:

在 www 服务器上,我生成一个包含两个参数的加密字符串: “文件名”和“expiration_stmp”。我将此加密字符串传递给图像服务器上的脚本 解密它,检查过期stmp是否不是过去,如果一切正常, 读取磁盘上的文件,输出正确的header,输出图片二进制数据给客户端。

所以我在 www 服务器上有一个类似这样的链接:“img src=http://IMAGES.myserver.com/get.php?XJDKUJHKDJSHJKDHJKHJKDJKDJKD” 其中 "XJDKUJHKDJSHJKDHJKHJKDJKDJKD" 解密时将提取到 filename=x.jpg,expiration_stmp=132920302030 并且图像服务器上的 get.php 将包含类似 header('Content-type...blablabl');读取文件(x.jpg).....

我要解决的问题是,在我生成加密字符串 XJDKUJHKDJSHJKDHJKHJKDJKDJKD 的时候, 我不知道expiration_stmp,因为管理员可以在未来的任何时间(从1分钟到5天)删除访问权限。 因此,当管理面板中的管理员删除该特定用户的文件读取权限时,必须拒绝该用户访问 到文件中。

为了解决这个问题,我想通过强制刷新页面每小时重新生成包含链接的页面,以生成包含新的 expire_stmps 的新加密字符串,最长有效时间为 1 小时。所以链接“img src=http://images.myserver.com/get.php?XJDKUJHKDJSHJKDHJKHJKDJKDJKD”只有1小时有效,所以当管理员取消用户的访问权限时,我只是拒绝重新生成一个新的加密字符串,以便用户在最后生成的 expire_stmp 过期(最多 1 小时)后无法再访问该文件。

目前这是我找到的最佳解决方案....我很想听听任何想法或更好的方法来处理这种情况?

谢谢

【问题讨论】:

  • 什么可以阻止人们将图像保存到他们的硬盘上?
  • 我不明白没有数据库这怎么可能。我也不同意您的说法,即使用数据库会使它无法扩展。如果管理员想要撤销权限,他必须在某处更改一些数据,如果不是 db 行,有什么要更改的?
  • 确定他们可以保存图片,但是如果他们认为以后可以访问图片,很多人不会保存图片.....所以当他们发现他们被拒绝访问图片页面时,如果他们试图通过链接访问图像,他们将无法这样做
  • 我猜 google 无法扩展,因为它使用会话和数据库,除了讽刺之外,您需要存储所有适合数据库的用户凭据和访问时间。
  • 我(尝试)解释的是图像服务器和 www 服务器不共享“用户凭据”。两台服务器将仅共享密钥以加密/解密从一台服务器传递到另一台的加密字符串

标签: php security scalability download


【解决方案1】:

为什么您认为按用户或会话进行限制不会扩展。您可能会生成访问代码而不是您的加密字符串。将访问代码存储在链接到您应该提供的图像的数据库中,以及用户 ID。如果管理员想要删除访问权限,只需删除记录,或将其标记为已过期。数据库的速度非常快,具有适当索引的数据库没有理由不能处理这个问题,即使扩展到数百万个活动图像也是如此。

【讨论】:

    【解决方案2】:

    最好的解决方案是在以下结构中使用数据库:

    • 创建一个包含 2 个表的数据库(如果需要,您可以添加更多)令牌、图像。

    token:token 将包含一个 userID 字段,该字段将指向另一个表以存储用户信息,一个 image ID 将引用图像数据库中的图像,以及一个到期日期和一个 ID。

    图像:它将具有 ID、图像名称

    对于下载链接,您可以简单地执行以下操作:download.php?tokenID=xxx,脚本会检查到期日期是否过去,这将在用户点击时实时发生文件,这样您就不会遇到未经授权的访问问题。检查到期后,您可以从令牌字段中获取 imageID 并在其他服务器上找到图像。

    您可以通过拥有一个或多个数据库服务器(我认为一个就足够了)轻松扩展此结构,并将所有文件/脚本服务器连接到远程数据库服务器。

    如果没有数据库,考虑到文件只会从 GET 变量中获取日期并且无法通过任何参考检查它是不可能的,并且如果您使用任何常见的 php 函数来加密变量,系统应该很容易破解.

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 2019-09-17
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多