Временное разрешение на просмотр фотографий и альбомов - PullRequest
2 голосов
/ 17 июня 2009

Я делаю сайт галереи. Фотографии и альбомы по умолчанию должны быть скрыты от общественности, но владелец может поделиться общедоступным URL, если он хочет. Я также хочу использовать короткие URL для этого.

Я пытаюсь найти лучший способ сделать это. Сначала я подумал, что у меня может быть таблица MySQL с коротким URL-кодом (что-то вроде Zneg8rjK) и полным URL-адресом (/album/5/). Когда пользователь посещает эту ссылку (mysite.com/Zneg8rjK), он устанавливает переменную сеанса, которая является просто хешем /album/5 плюс соль, и затем перенаправляет их на полный URL-адрес. Затем на этой странице я могу просто перефразировать текущую страницу и проверить, находится ли она в своей сессии или нет. Нет проблем ... но что происходит, когда они нажимают на фотографию в этом альбоме? Он ломается.

Итак, следующее решение, о котором я подумал, было то, что я должен хранить секретный ключ с каждым альбомом и каждой фотографией, а затем иметь публичный адрес, такой как /album/5/secretkey. Короткий URL может просто указывать на это. Но тогда как я могу дать пользователю разрешение на просмотр всех фотографий в альбоме? Должен ли я просто связать каждую фотографию, чтобы она указала на секретную версию URL фотографии, но только если они получили доступ к альбому по секретному URL-адресу альбома? Меня беспокоит то, что я хочу как можно больше хранить секретные ключи / URL-адреса вне адресной строки, чтобы пользователи случайно не делились ею с людьми, которых они не должны ... но это не так важно, если их нет. т любые лучшие решения.

Мысли


Подождите секунду, мне вообще нужно хэшировать URL? Для клиентов нет способа изменить переменные сеанса?

Ответы [ 3 ]

2 голосов
/ 17 июня 2009

Полагаю, это немного зависит от того, как вы проверяете права доступа - я бы посоветовал иметь ключ для целого альбома и ключ для отдельных фотографий.

Перенаправление в первой части вашего поста на самом деле звучит не так уж плохо для меня, только вам нужно проверить поставленный ключ в сеансе с двумя действительными вариантами - один для отдельной фотографии и один для альбом, который содержит эту фотографию. Если какой-либо из них подтвержден, покажите фотографию (вместо «сломать»).

Надеюсь, это поможет!

1 голос
/ 17 июня 2009

Возможно, вы захотите использовать две клавиши, как сказал вышеупомянутый человек. Возможно, вы не захотите ограничивать доступ через один URL-адрес, такой как mysite.com/hashhere, вместо этого вы должны иметь короткий URL-адрес, чтобы иметь возможность включать хэш, поэтому, если у них есть правильный хэш, независимо от того, по какой ссылке они переходят, они могут его просмотреть .

Чтобы сделать его еще более безопасным, дайте владельцу галереи возможность обновить ключ хеша, чтобы, если он предоставил доступ пользователям, а кто-то опубликовал общедоступный URL-адрес или что-то подобное, они могут снова заблокировать его.

0 голосов
/ 19 июня 2009

Хорошо, вот что я делаю:

$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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...