2009-06-17 34 views
2

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

我想弄清楚这样做的最佳方法。起初我以为我可以有一个带有短URL代码的MySQL表(类似Zneg8rjK)和完整的URL(/album/5/)。当用户访问此链接(mysite.com/Zneg8rjK)时,它会设置一个会话变量,该变量只是/album/5加上一个salt的散列,然后将其重定向到完整的URL。然后在该页面上,我可以重新检查当前页面并检查它是否在他们的会话中。没问题......但是当他们点击该专辑中的照片时会发生什么?它打破了。

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

想法?


等一下,我甚至需要散列URL吗?客户无法修改会话变量吗?

+0

画廊的结构如何?这是一个相当不可能的问题来回答,而不知道它是如何设置的,以及当用户与图像等进行交互时会发生什么。 – 2009-06-17 17:53:04

+0

我不确定你的意思?下面的答案对我来说很好。每张照片都属于一张专辑...您还需要什么?没有任何事情是成立的。当用户试图查看图像时,它会检查他是否有权查看图像,然后或者向他显示图像或告诉他不要。 – mpen 2009-06-17 18:28:08

回答

2

我想这取决于你如何检查权限一点 - 我建议具有对整张专辑的关键,而对于个人照片的一个关键。

在您的文章的第一部分重定向东西实际上听起来并不对我不好,只是你必须检查在会话中提供的密钥对2个有效的选项 - 一个用于个人照片,和一个包含该照片的相册。如果任何一个验证,显示照片(而不是'分解')。

希望这会有所帮助!

+0

是的......好吧,我不得不重新从照片页面重建相册网址,而不是使用$ _SERVER ['REQUEST_URI']或类似的东西来做额外的检查,但我想这不是一个真正的问题。我想这并不坏。谢谢 – mpen 2009-06-17 18:20:04

1

你可能想要像上面的人说的那样做两个键。你可能不想限制像mysite.com/hashhere这样的一个URL访问,而应该让短URL能够包含散列,所以如果他们有正确的散列,不管他们到了什么链接,他们都可以查看它。

为了使它更加安全,给画廊的主人以刷新哈希键,因此,如果他们与用户共享,并有人张贴公共URL或东西,他们可以再次锁定它的选项。

0

好,这是我在做什么:

$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; 
} 

但我仍然不确定我对此的看法。如果在某个时候我想要我的短网址指向/photo/5/some_other_param?它将正确地重定向用户,但它将在权限数组中存储错误的变量。我想我应该做的是将另一列添加到我的short_urls表中,指定它应该放入权限数组中的究竟是什么,呃?


其实我更喜欢这个解决方案,无论如何我认为。这样,并不是每个短的URL甚至不得不设置权限。新代码:

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