2009-06-17 4 views
2

Je crée un site Web de galerie. Les photos et les albums doivent être masqués par défaut, mais le propriétaire peut partager une URL publique s'il le souhaite. Je veux également utiliser des URL courtes pour cela. J'essaie de comprendre la meilleure façon de le faire. Au début, j'ai pensé que je pourrais avoir une table MySQL avec le code URL court (quelque chose comme Zneg8rjK), et l'URL complète (/album/5/). Lorsque l'utilisateur visite ce lien (mysite.com/Zneg8rjK), il définit une variable de session qui est juste un hachage de /album/5 plus un sel, puis il les redirige vers l'URL complète. Ensuite, sur cette page, je peux simplement ressasser la page en cours et vérifier si c'est dans leur session ou pas. Pas de problème ... mais que se passe-t-il quand ils cliquent sur une photo de cet album? Ça tombe en panne. Donc, la solution suivante que je pensais était que je devrais stocker une clé secrète avec chaque album et chaque photo, puis avoir une adresse publique comme /album/5/secretkey. L'URL courte pourrait juste pointer vers ceci à la place. Mais alors, comment puis-je autoriser l'utilisateur à voir toutes les photos de l'album? Devrais-je simplement relier chaque photo pour pointer vers la version secrète de l'URL de la photo, mais seulement si elles ont accédé à l'album via l'URL de l'album secret? Mon souci est que je veux garder les clés secrètes/URL hors de la barre d'adresse autant que possible afin que les utilisateurs ne le partagent pas accidentellement avec des gens qu'ils ne devraient pas ... mais ce n'est pas un gros problème s'il n'y a pas ' t de meilleures solutions.Permission temporaire de visionner des photos et des albums

Pensées?


Attendez une seconde, ai-je même besoin de hacher l'URL? Il n'y a aucun moyen pour les clients de modifier les variables de session est là?

+0

Quelle est la structure de la galerie? C'est une question plutôt impossible à répondre sans savoir comment elle est configurée, et ce qui se passe quand l'utilisateur interagit avec des images, etc. –

+0

Je ne suis pas sûr de ce que vous voulez dire? Les réponses ci-dessous sonnent bien pour moi. Chaque photo appartient à un album ... que demander de plus? Rien n'est encore gravé dans la pierre. Lorsque l'utilisateur essaie d'afficher une image, il vérifie s'il a la permission de la voir, puis lui montre l'image ou lui dit de s'enculer. – mpen

Répondre

2

Je suppose que cela dépend un peu de la façon dont vous vérifiez les autorisations - je suggère d'avoir une clé pour un album entier, et une clé pour les photos individuelles. La redirection dans la première partie de votre message ne me semble pas si grave que ça, seulement vous devez vérifier la clé fournie dans la session contre 2 options valides - une pour la photo individuelle, et une pour l'album qui contient cette photo. Si l'un des deux valide, affichez la photo (au lieu de «décomposer»).

Espérons que cela aide!

+0

Ouais ... eh bien, je devrais reconstruire l'URL de l'album à partir de la page photo au lieu d'utiliser $ _SERVER ['REQUEST_URI'] ou quelque chose du genre pour faire le contrôle supplémentaire, mais je suppose que ce n'est pas vraiment un problème. Je suppose que ce n'est pas si mal. Merci – mpen

1

Vous voudrez probablement faire les deux clés comme indiqué ci-dessus. Vous ne voudrez peut-être pas restreindre l'accès en passant par une URL comme mysite.com/hashhere, mais vous devriez avoir l'URL courte pour inclure le hachage, donc s'ils ont le bon hachage quel que soit le lien vers lequel ils vont, ils peuvent le voir . Pour le rendre encore plus sûr, donnez au propriétaire de la galerie la possibilité d'actualiser la clé de hachage. Ainsi, s'ils ont partagé avec les utilisateurs et que quelqu'un publie l'URL publique ou quelque chose, ils peuvent la verrouiller à nouveau.

+0

Ouais, c'est déjà une fonctionnalité planifiée :) Donc vous suggérez que j'autorise mysite.com/hash AND monsite.com/album/id/hash? L'idée de n'utiliser que l'ancien était que je pouvais insérer le hachage dans une clé de session, rediriger comme je le ferais de toute façon et le cacher de l'URL. Je pourrais rediriger vers la même page de l'album mais sans le hash aussi ... mais je ne suis pas tout à fait sûr de l'avantage supplémentaire? – mpen

+0

C'était en fait ma faute, je vois ci-dessus que vous avez expliqué le hash a déjà cela. Je pensais plutôt à "permission" où le hash dicte juste quel album vous pourriez voir. Vous avez raison dans votre commentaire, si le hash contient cette information, vous n'avez pas besoin de l'étape supplémentaire. – Wade

0

Ok, voici ce que je fais:

$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']); 
} 

Cela permet d'économiser l'autorisation dans une variable de session et redirige l'utilisateur vers la page appropriée. Puis sur la page de photo je fais ceci:

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

Mais je ne suis toujours pas sûr de ce que je ressens à ce sujet. Que se passe-t-il si, à un moment donné, je veux que mon URL courte pointe vers /photo/5/some_other_param? Il redirigera l'utilisateur correctement, mais il stockera la mauvaise variable dans le tableau des autorisations.Je suppose que ce que je devrais faire est d'ajouter une autre colonne à mon tableau short_urls qui spécifie exactement ce qu'il devrait mettre dans le tableau des permissions, hein?


En fait, je préfère cette solution de toute façon je pense. De cette façon, chaque URL courte n'a même pas besoin de définir des autorisations. Nouveau code:

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