2010-08-24 8 views
4

Sur un projet réel (site de rencontres) j'ai le scénario suivant:comment obtenir des photos de membres pour le site Web à fort trafic

membres peuvent télécharger des photos (profil principal) et créer des albums et attribuer des photos à elle. Maintenant, le membre ne peut choisir que d'autoriser les membres inscrits, les membres premium ou les membres de ses favoris à accéder à l'album.

La solution la plus simple consiste à masquer l'album, mais si quelqu'un ayant accès affiche l'url src sur la photo, il sera accessible à tous ceux qui ont l'URL. Je vois flickr et facebook les sécuriser dans le bon sens, mais comment je peux implémenter cela sans avoir besoin d'interroger plusieurs fois la base de données et de répliquer l'authentification/session de l'utilisateur. Les photos seront stockées sur un serveur propre (vernis/nginx).

Est-ce que quelqu'un a une idée de comment cela peut être fait dans l'esprit du trafic élevé et d'utiliser moins de ressources que possible?

Les solutions doivent pouvoir gérer les 20m réels et les 30m photos.

+0

La réponse de ircmaxell est une bonne façon, mais j'ai un problème de sécurité. Tous les médias seront dans la même structure de dossier être placé maintenant si je veux sécuriser certains fichiers, je peux utiliser l'URL spéciale comme: domain.xx/secure/hash/time/dossier/filename.ext mais j'ai le problème que tout le monde peut accéder au fichier avec domain.xx/dossier/filename.ext parce que je ne peux pas déplacer le média après que le membre a placé des options de confidentialité à un autre dossier, n'importe quel redressement comment je peux faire cela? – Nenad

Répondre

4

Eh bien, une possibilité serait d'exécuter quelque chose comme Lighttpd's mod_secdownload.

Fondamentalement, vous définissez une chaîne "secret" dans la section de configuration. Ensuite, lorsque vous générez les liens, au lieu de créer un lien vers la ressource, il s'agit d'un lien temporel (il n'est donc valide que pour $x nombre de secondes). De cette façon, l'utilisateur doit visiter à nouveau la page (et donc passer à nouveau le contrôle d'accès) avant d'être autorisés à voir cette image ...

Apache a un module similaire: mod_auth_token ...

+0

ircmaxell - Cette solution, je vais le garder à l'esprit, j'espère que cela fonctionnera pour les photos que nous montrons en ligne avec img src tag. – Nenad

+0

Il devrait. Si le temps est passé, il retournera simplement soit un 403 Interdit (Si le jeton est invalide), un 410 Fini si le délai est atteint ou un 404 s'il n'y a pas de fichier ... Donc ça * devrait * aider pour votre spécifique cas ... Et oui, l'url généré peut être utilisé directement dans l'image tag. Cela va se résoudre de la même manière que '/ path/to/image.gif' avec les mêmes en-têtes. La seule différence est que l'URL expirera après un certain temps ... – ircmaxell

+0

Je vais essayer un peu de test avec cette solution j'ai vu nginx fournir une fonctionnalité smiliar avec ngx_http_secure_download_module maintenant j'espère qu'il n'y a pas une grande performance perdue en l'utilisant. Le seul problème que j'ai vu est que nginx demande un dossier pour les choses sécurisées parce que nous avons tous les fichiers stockés dans la même structure, je ne vois pas vraiment une solution comment l'utiliser. Le membre doit pouvoir modifier les autorisations comme il le souhaite sur l'application Web et il ne sera pas possible de déplacer des fichiers sur le serveur de stockage de photos. – Nenad

0

La meilleure solution consiste à stocker l'image en dehors de la partie accessible sur le Web de votre serveur. Ensuite, au lieu de référencer directement la photo, vous faire référence à une page pointant php à l'image comme si:

http://www.example.com/image.php?imageid=1234567

Ensuite, dans votre script php, vous pouvez vérifier si l'utilisateur connecté a accès à la photo et si c'est le cas, vous diffusez l'image à l'utilisateur dans la réponse.

+0

Ce que le QA comprend déjà. Il demande comment optimiser cela. –

+0

@Kibee - De cette façon, cela prend trop de ressources et n'est pas utilisable pour nous. L'idée serait de pouvoir gérer l'auth sur le serveur photo avec l'utilisation de certaines clés sécurisées et/ou de certaines informations stockées par memcached mais je ne comprends pas comment flickr/facebook font cela exactement. – Nenad

+1

Si vous pouvez accéder à la photo sans consulter les informations de session PHP, il n'y a aucun moyen d'empêcher l'utilisateur de saisir l'URL et de l'afficher ailleurs. En regardant sur facebook, il semble qu'ils utilisent juste une URL très longue non accessible pour chaque photo. Si vous prenez une photo URL de Facebook et que vous la publiez dans un navigateur, vous n'êtes pas connecté à Facebook avec, vous pouvez toujours accéder à la photo. – Kibbee

0

Comme une idée ...

Vous pouvez créer une table de correspondance où vous « préparer » les autorisations d'accès pour les paires user-> photo en fonction des favoris, amis etc.

Puis vous retournez les images en fonction de ces autorisations, mais mis en cache par utilisateur. Cela réduira le stress sur vos serveurs, mais il y aura un certain délai dans l'application de restrictions en raison des délais d'attente du cache.

+0

Le problème sera le traitement, si je comprends bien, vous stocker les informations entre l'utilisateur et l'accès à chaque objet photo, cela se traduirait par de nombreux enregistrements (le site a 20m de membres et 30m photos), ce qui rend difficile le magasin. – Nenad

+0

Ok, déposez cette partie alors. L'indice est de mettre en cache les résultats de l'image mais de varier la mise en cache par les utilisateurs. C'est si votre cadre le supporte. –

+0

Encore je vois de cette façon une utilisation de trop de ressources. Nous utilisons un cadre personnalisé pour ce projet afin que nous puissions l'adapter complètement à nos besoins. – Nenad

Questions connexes