【问题标题】:Temporary permission to view photos and albums查看照片和相册的临时权限
【发布时间】:2010-11-03 18:16:01
【问题描述】:

我正在制作一个画廊网站。默认情况下,照片和相册应该对公众隐藏,但所有者可以根据需要共享公共 URL。我也想为此使用短 URL。

我正在尝试找出最好的方法来做到这一点。起初我以为我可以有一个带有短 URL 代码(类似于Zneg8rjK)和完整 URL(/album/5/)的 MySQL 表。当用户访问此链接 (mysite.com/Zneg8rjK) 时,它会设置一个会话变量,该变量只是 /album/5 加上一个盐的哈希值,然后将它们重定向到完整的 URL。然后在该页面上,我可以重新散列当前页面并检查它是否在他们的会话中。没问题...但是当他们单击该相册中的照片时会发生什么?它坏了。

所以,我想到的下一个解决方案是,我应该为每张专辑和每张照片存储一个密钥,然后拥有一个像 /album/5/secretkey 这样的公共地址。短 URL 可以只指向这个。但是,如何授予用户查看相册中所有照片的权限?我是否应该只链接每张照片以指向照片 URL 的秘密版本,但前提是他们通过秘密相册 URL 访问相册?我担心的是我想尽可能地将密钥/URL 保留在地址栏中,这样用户就不会意外与他们不应该与他们分享的人分享它……但如果没有的话,这不是一个大问题。没有更好的解决方案。

想法?


等一下,我还需要对 URL 进行哈希处理吗?客户端没有办法修改会话变量吗?

【问题讨论】:

  • 画廊的结构是什么?如果不知道它是如何设置的,以及当用户与图像交互时会发生什么等情况,这是一个相当不可能回答的问题。
  • 我不确定你的意思?下面的答案对我来说听起来不错。每张照片都属于一个相册...您还需要什么?没有什么是一成不变的。当用户试图查看一张图片时,它会检查他是否有查看该图片的权限,然后要么显示给他图片,要么告诉他别管它。

标签: php mysql authentication permissions


【解决方案1】:

好的,这就是我正在做的事情:

$result = mysql_safe_query('SELECT * FROM short_urls WHERE short=%s', $_GET['p']);
if(mysql_num_rows($result)> 0) {
    $url = mysql_fetch_assoc($result);
    $_SESSION['permissions'][$url['long']] = true;
    redirect($url['long']);
}

这会将权限保存在会话变量中并将用户重定向到正确的页面。然后在照片页面上我这样做:

if(array_key_exists('/photo/'.$photo_id, $_SESSION['permissions'])
    || array_key_exists('/album/'.$photo['album_id'], $_SESSION['permissions'])) {
    $can_see = true;
}

但我仍然不确定我对此有何感想。如果在某个时候我希望我的短 URL 指向 /photo/5/some_other_param 怎么办?它会正确重定向用户,但会在权限数组中存储错误的变量。我想我应该做的是在我的short_urls 表中添加另一列,指定它应该放入权限数组中的确切内容,嗯?


其实我觉得我更喜欢这个解决方案。这样,甚至不是每个短 URL 都必须设置权限。新代码:

if(isset($url['perm_key'])) $_SESSION['permissions'][$url['perm_key']] = true;

【讨论】:

    【解决方案2】:

    您可能想要像上面的人说的那样做这两个键。您可能不想限制通过 mysite.com/hashhere 之类的 URL 进行访问,而是应该让短 URL 能够包含哈希,因此如果他们有正确的哈希,无论他们转到哪个链接,他们都可以查看它.

    为了使其更加安全,请让图库的所有者也可以选择刷新哈希密钥,以便如果他们与用户共享并且有人发布了公共 URL 或其他内容,他们可以再次将其锁定。

    【讨论】:

    • 是的,这已经是一个计划中的功能 :) 所以你建议我允许 mysite.com/hash 和 mysite.com/album/id/hash?仅使用前者的想法是我可以将哈希填充到会话密钥中,像我需要的那样重定向并将其隐藏在 URL 中。我可以从相册重定向到同一页面,但也没有哈希...但我只是不完全确定额外的好处?
    • 这实际上是我的错,我在上面看到你解释了哈希已经有了。我的想法更像是“许可”,其中哈希仅指示您可以看到的专辑。您的评论是正确的,如果哈希包含您不需要额外步骤的信息。
    【解决方案3】:

    我想这在一定程度上取决于您检查权限的方式 - 我建议为整个相册设置一个密钥,为单个照片设置一个密钥。

    您帖子第一部分中的重定向内容实际上对我来说并没有那么糟糕,只是您必须根据 2 个有效选项检查会话中提供的密钥 - 一个用于单张照片,一个用于包含该照片的相册。如果其中任何一个验证通过,请显示照片(而不是“分解”)。

    希望这会有所帮助!

    【讨论】:

    • 是的......好吧,我必须从照片页面重建相册 URL,而不是使用 $_SERVER['REQUEST_URI'] 或类似的东西来做额外的检查,但我猜猜这不是一个真正的问题。我想这还不错。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 2021-03-06
    • 2020-02-17
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多