J'ai pas encore fait le tour de toutes les possibilités, mais pour un futur site d'e-commerce, j'aurais besoin d'empécher l'affichage des images de certains dossiers lorsqu'on saisi directement l'url de celles-ci. En gros, il y a des visuels soumis par des graphistes, et certains sont retenus pour la vente. A partir de l'url d'un de ces visuels en vente, on peut facilement trouver l'url d'autres visuels normalement inaccessible. Le vendeur souhaiterait évidemment que la concurrence ne puisse pas accéder aux visuels qui n'ont pas encore été mis en vente pour éviter tout vol.
Il y a plusieurs solutions :
- La protection par .htaccess basée sur le referer, protection déjà en place mais qui n'est pas activée lorsqu'il n'y a pas de referer. Ca fonctionnerait en refusant aussi l'accès quand il n'y a pas de referer, mais pas mal d'outils masquent ce référer, donc pas bon
- Par url-rewriting, une redirection des adresses des images vers un script php qui vérifie le droit d'accès à cette image et la renvoi via des headers et un readfile. Le problème est que dans mon cas, cette solution ne peut marcher qu'en effectuant au moins une requête pour vérifier si le visuel fait parti de ceux qu'on peut afficher, ce qui commence à faire lourd en plus de l'envoi "manuel" du "contenu" de l'image, d'autant plus qu'il peut y avoir pas mal de ces visuels sur certaines pages.
- On peut aussi remplacer les liens vers les images par l'appel d'un script qui fait plus ou moins la même chose que celui de l'exemple précédent, en ajoutant un .htaccess deny from all. Mais bon, si le lien direct ne passe plus, on peut sans problème afficher l'image depuis l'url du script, sauf si-celui ci effectue aussi une requête pour vérifier le droit d'affichage de l'image. Et la ca n'a plus vraiment d'interêt par rapport à la solution précédente qui est plus transparente (on désactive l'htaccess, et ca supprime la protection, sans avoir a modifier quoi que ce soit dans les sources html/php)
- Pour essayer d'économiser toute requête sql, on peut envisager la solution précédente en ajoutant par exemple le timestamp actuel en paramêtre, le script ne retournant l'image que si ce timestamp n'est pas dépassé de plus de X secondes. Mais il faut que X soit suffisamment grand pour que ca couvre l'écart entre la génération de la page et le début du chargement de la dernière image dans le cas ou ca rame. Et ca n'empeche en rien l'affichage depuis l'url si le "concurrent" est assez futé pour saisir à la main un bon timestamp dans l'url.
Finalement :
En clair, je me demande s'il y a une solution permettant d'éviter toute requête.
Plutot que faire des vérifications sur les droits, la solution recherchée serait plutot de déterminer si l'image est appelée directement depuis la barre d'adresse ou par l'intermédiaire d'une balise <img>, mais sauf erreur de ma part (à 6h du mat j'ai plus toute ma tête
), les navigateurs récupèrent l'image de la même facon dans les 2 cas, sans différence d'header, et donc sans moyen de détecter ca de facon générique.
Si quelqu'un a de quoi confirmer ou infirmer cela, le temps que je fasse quelques recherches de plus, qu'il n'hésite pas à user son clavier dans le coin
Il y a plusieurs solutions :
- La protection par .htaccess basée sur le referer, protection déjà en place mais qui n'est pas activée lorsqu'il n'y a pas de referer. Ca fonctionnerait en refusant aussi l'accès quand il n'y a pas de referer, mais pas mal d'outils masquent ce référer, donc pas bon
Code:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://([^/]*)domain.tld/?.*$ [NC]
RewriteRule .*\.(jpe?g|gif|png|bmp)$ - [F,NC,L]
- Par url-rewriting, une redirection des adresses des images vers un script php qui vérifie le droit d'accès à cette image et la renvoi via des headers et un readfile. Le problème est que dans mon cas, cette solution ne peut marcher qu'en effectuant au moins une requête pour vérifier si le visuel fait parti de ceux qu'on peut afficher, ce qui commence à faire lourd en plus de l'envoi "manuel" du "contenu" de l'image, d'autant plus qu'il peut y avoir pas mal de ces visuels sur certaines pages.
Code:
RewriteEngine On
RewriteRule .*\.(jpe?g|gif|png|bmp)$ /secureimg.php [NC,L]
- On peut aussi remplacer les liens vers les images par l'appel d'un script qui fait plus ou moins la même chose que celui de l'exemple précédent, en ajoutant un .htaccess deny from all. Mais bon, si le lien direct ne passe plus, on peut sans problème afficher l'image depuis l'url du script, sauf si-celui ci effectue aussi une requête pour vérifier le droit d'affichage de l'image. Et la ca n'a plus vraiment d'interêt par rapport à la solution précédente qui est plus transparente (on désactive l'htaccess, et ca supprime la protection, sans avoir a modifier quoi que ce soit dans les sources html/php)
- Pour essayer d'économiser toute requête sql, on peut envisager la solution précédente en ajoutant par exemple le timestamp actuel en paramêtre, le script ne retournant l'image que si ce timestamp n'est pas dépassé de plus de X secondes. Mais il faut que X soit suffisamment grand pour que ca couvre l'écart entre la génération de la page et le début du chargement de la dernière image dans le cas ou ca rame. Et ca n'empeche en rien l'affichage depuis l'url si le "concurrent" est assez futé pour saisir à la main un bon timestamp dans l'url.
Finalement :
En clair, je me demande s'il y a une solution permettant d'éviter toute requête.
Plutot que faire des vérifications sur les droits, la solution recherchée serait plutot de déterminer si l'image est appelée directement depuis la barre d'adresse ou par l'intermédiaire d'une balise <img>, mais sauf erreur de ma part (à 6h du mat j'ai plus toute ma tête

Si quelqu'un a de quoi confirmer ou infirmer cela, le temps que je fasse quelques recherches de plus, qu'il n'hésite pas à user son clavier dans le coin
