Sécuriser le téléchargement de photos payantes (Ex: GettyImages)

Sécuriser le téléchargement de photos payantes (Ex: GettyImages) - PHP - Programmation

Marsh Posté le 01-08-2005 à 10:10:34    

Bonjour à tous,
 
Je dois développer pour mon stage un site de vente de photos d'événements sportifs. Très exactement sur le modèle de http://creative.gettyimages.com mais spécialisé dans le sport.
Mon problème est que je ne veux pas que lorsqu’un client achète les droits de téléchargement d'une photo il puisse accéder à toutes les autres photos en manipulant l'url.
Exemple :
Je suis un client et j'ai acheté la photo « 01.jpeg », j’ai donc maintenant accès à un lien de la forme :
http://www.monsite.com/photos/01.jpeg
Il se trouve que je suis un petit futé et je que je décide de changer l’url en :
http://www.monsite.com/photos/02.jpeg
Et là, oh magie, je peux télécharger gratuitement une autre image.
Et ça je doute que ça fasse rire le client pour qui je dois développer le site… ;)
 
Voici les « solutions » que j’ai déjà trouvées :
 
1. Ne pas permettre le téléchargement, mais envoyer directement l’image au client.
-> Problème : Envoyer (email) une image de 300dpi qui va peser entre 3 et 10 Mo ce n’est bien évidemment pas possible.
 
2. Déplacer l’image concernée par le téléchargement dans un dossier temporaire et envoyer cette url « temporaire » donc au client.
-> Problème : Déplacer des fichiers de plusieurs mégaoctets (3-10 Mo) va représenter une charge de travail non négligeable pour le serveur. De plus ce n’est pas une solution rationnelle (deux fichiers identiques à deux endroits différents au même moment…).
 
3. Donner un nom complexe à chacune des images.  
Exemple :  
01.jpeg -> fgfdUDDfdf34nfdU2njdfds76jfds_dsf7633dsffsf765dsd.jpeg
De cette manière il y a peu de chance que le petit malin puisse tomber sur un autre nom d’image.  
-> Problème : Mais la possibilité existe toujours, cette solution n’est donc pas 100% fiable. De plus la maintenance du site est un peu compliquée par cette charte de nommage peu orthodoxe, et ce n’est pas très user friendly, le client se retrouvant donc avec des images au nom exotique sur son ordinateur…
 
4. Utiliser les propriétés d’URL rewriting (ou simplement de Redirect ?).
En utilisant un fichier .htaccess je fais en sorte que l’url apparente de la forme http://www.monsite.com/photo.php?i [...] ffsf765dsd soit en réalité interprétée par le serveur apache comme http://www.monsite.com/pct/01.jpeg de cette manière le petit malin ne peut télécharger une image gratuitement en changeant l’id (voire solution 3).
-> Problème : Identique à la solution 3. De plus utiliser un fichier .htaccess entraine une hausse de la consommation en ressource système sur le serveur. De plus je ne suis pas certain de pouvoir obtenir ce genre de chose avec un .htaccess. Confirmation ? / Infirmation ?
 
Voilà où j'en suis aujourd'hui...
 
Je suis donc preneur de toute autre solution / conseil etc... ;)
 
Merci beaucoup

Reply

Marsh Posté le 01-08-2005 à 10:10:34   

Reply

Marsh Posté le 01-08-2005 à 10:15:21    

tu peux faire http://www.monsite.com/photo.php avec dedans  
 
session_start();
if (droits_ok(..)) {
    header("Content-Type: image/jpeg" );
    include("repertoireprotege/imageaafficher.jpg" );
}


Message édité par mcjoedassin le 01-08-2005 à 10:16:18
Reply

Marsh Posté le 01-08-2005 à 13:05:59    

appel d'un script php avec identification du type, puis apres validation du user/pwd, envoyer l'image, toujours php, avec les header.


---------------
MZP est de retour
Reply

Marsh Posté le 01-08-2005 à 13:59:59    

+1

Reply

Marsh Posté le 01-08-2005 à 14:03:17    

Et les images protegees seront mises dans un repertoires protege par un .htaccess par exemple :)
 
Edit : on ne le repetera jamais assez mais include (de meme que require) inclut le contenu du fichier mais il y a un mecanisme de parsing du code PHP a l'interieur du fichier inclus qui est mis en route. Depense inutile de ressource ! Mieux vaut utiliser readfile lorque le fichier a inclure ne contient pas de PHP.


Message édité par afbilou le 01-08-2005 à 14:08:14
Reply

Marsh Posté le 01-08-2005 à 14:15:52    

un chmod 700 sur le dossier d'images suffirait à les protéger non ?

Reply

Marsh Posté le 01-08-2005 à 14:24:55    

Ca riquerait pas géner au niveau de l'accès aux photos par php?


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 01-08-2005 à 14:31:17    

éventuellement tu mets l'extension .jpg et un fichier .htaccess avec
<Files machin.jpg>
    ForceType application/x-httpd-php
</Files>
 
sinon, non, ça ne gène pas ...
 
c'est fou comme les sujets peuvent se ressembler
http://forum.hardware.fr/hardwaref [...] m#t1166640

Reply

Marsh Posté le 04-08-2005 à 04:46:41    

Thx guys!
 
Je regarde tout ça, merci beaucoup.

Reply

Marsh Posté le 23-08-2005 à 09:17:58    

Label83 a écrit :

Thx guys!
 
Je regarde tout ça, merci beaucoup.


 
Bonjour à tous,
Je me suis repenché aujourd'hui sur cette problématique et en suivant vos réponses j'ai trouvé le bout de code suivant (http://au.php.net/header):
 

Code :
  1. <?PHP
  2. function dl_file($file){
  3.    //First, see if the file exists
  4.    if (!is_file($file)) { die("<b>404 File not found!</b>" ); }
  5.    //Gather relevent info about file
  6.    $len = filesize($file);
  7.    $filename = basename($file);
  8.    $file_extension = strtolower(substr(strrchr($filename,"." ),1));
  9.    //This will set the Content-Type to the appropriate setting for the file
  10.    switch( $file_extension )
  11.    {
  12.      case "jpeg":
  13.      case "jpg": $ctype="image/jpg"; break;
  14.      //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
  15.      case "php":
  16.      case "htm":
  17.      case "html":
  18.      case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>" ); break;
  19.      default: $ctype="application/force-download";
  20.    }
  21.    //Begin writing headers
  22.    header("Pragma: public" );
  23.    header("Expires: 0" );
  24.    header("Cache-Control: must-revalidate, post-check=0, pre-check=0" );
  25.    header("Cache-Control: public" );
  26.    header("Content-Description: File Transfer" );
  27.  
  28.    //Use the switch-generated Content-Type
  29.    header("Content-Type: $ctype" );
  30.    //Force the download
  31.    $header="Content-Disposition: attachment; filename=".$filename.";";
  32.    header($header );
  33.    header("Content-Transfer-Encoding: binary" );
  34.    header("Content-Length: ".$len);
  35.    @readfile($file);
  36.    exit;
  37. }
  38. dl_file('my_pictures/IMG_5575.jpg');
  39. ?>


 
Ca m'a l'air de fonctionner et ça semble assez sécurisé.
 
Je poursuis dans cette voie ;)
 
Merci encore
 
Cheers,
Pierre


Message édité par Label83 le 23-08-2005 à 09:18:53
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed