protections de fichiers derriere allopass

WRInaute occasionnel
Bonjour,

Je suis actuellement en train de faire le site d'un groupe de musique sur lequel les morceaux seront vendus derriere allopass.
j'utilise donc le script php fournit par allopass pour le telechargement d'un fichier.

Code:
<?php
 $RECALL=$HTTP_GET_VARS["RECALL"];
 if (trim($RECALL)=="") 
 {
  // La variable RECALL est vide, renvoi de l'internaute
  //vers une page d'erreur
  header("Location: erreur.html");
  exit;
 }

 // $RECALL contient le code d'accès
 $RECALL = urlencode($RECALL); 

 // $AUTH doit contenir l'identifiant de VOTRE document
 $AUTH = urlencode("54/75/456");
 
 // $FICHIER_LOCAL doit contenir le chemin et le nom du fichier
 //à téléchargé présent sur votre site
 $FICHIER_LOCAL = "mes_fichiers/monfichier.zip";

 // $FICHIER_INTERNAUTE doit contenir le nom du fichier qui sera créé sur
 //l'ordinateur de l'internaute
 // Ce nom ne doit pas être forcément le même que le nom du fichier local !
 $FICHIER_INTERNAUTE = "lefichier.zip";

 // envoi de la requête vers le serveur AlloPAss
 // afin de vérifier le code d'accès de l'internaute.
 // Dans la variable $r[0] on aura la réponse du serveur
 $r=@file("http://www.allopass.com/check/vf.php4?CODE=$RECALL&AUTH=$AUTH");

 // on test la réponse du serveur
 if (ereg("ERR",$r[0]) || ereg("NOK",$r[0])) 
 {
  // Le serveur a répondu ERR ou NOK : l'accès est donc refusé
  header("Location: erreur.html");
  exit;
 }

 // Le code est valide : on lance le téléchargement du fichier
 if (file_exists($FICHIER_LOCAL)==true) 
 {
  if (strstr($HTTP_USER_AGENT,"MSIE"))
   $attachment="";
  else
   $attachment=" attachment;";

  header( "Content-type: application/octet-stream" );
  header( "Content-Disposition:$attachment filename=$FICHIER_INTERNAUTE");
  header( "Content-Description: File Transfert" );
  header( "Content-Length: ".filesize($FICHIER_LOCAL).""); 
  readfile($FICHIER_LOCAL);
  exit;
 }
?>

en ayant pris soit de mettre la variable RECALL=1 dans le formulaire d'entrée du code allopass.

J'ai également mis un htaccess pour empécher les liens direct de la forme

Code:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mon-domaine\.fr/.*$ [NC]
RewriteRule \.(mp3|rar|zip)$ http://mon-domaine.fr/interdit.php [NC,R,L]

tout avait l'air de fonctionner , j'ai par exemple essayé de recuperer le fichier avec intellitamper qui a scanné le site, il a bien été refusé. Mais je viens de m'apercevoir que je réussissais a telecharger le fichier en tapant le lien directement dans Free download manager .

Je ne sais pas trop comment palier à cela.

Quelqu'un a une idée, pour securisé correctement les fichiers ?

Merci
 
WRInaute occasionnel
Code:
 $FICHIER_LOCAL = "mes_fichiers/monfichier.zip";

Tu peux eventuellement renommer dynamiquement toutes les 10 minutes le dossier "mes_fichiers".

Le referer etant trop simple à spoofer pour acceder à un fichier protégé.
 
WRInaute discret
Hi,

Si tu ne veux pas changer le nom des dossiers (ou des fichiers) pour diverses raisons, je ne vois que le cryptage de tes fichiers (sont-ils gros ? quelques megas ?).
Le script décrypte le fichier coté serveur, créé un fichier temporaire dont le nom aléatoire est fourni à l'internaute à qui tu envoie le lien
Le fichier tmp est ensuite détruit. (au bout de combien de temps.... !?)

Ytz.
 
WRInaute occasionnel
Non les fichiers ne sont pas tres gros , ce sont des mp3 de 5 mo en moyenne et en plus il n'y en a qu'une dizaine.
Cela ne me gène pas de renommer éventuellement le répertoire tous les 5 min par exemple, mais je ne vois pas trop comment faire et le mettre en oeuvre . J'imagine que c'est avec une tache Cron. Je n'ai jamais utilisé cette procédure. Si une âme charitable pouvait me guider, je lui en serait très reconnaissant. :wink:

Merci encore.
 
WRInaute accro
le plus pratique reste quand même de faire appel à un script intermédiaire qui va charger le contenu du fichier et le renvoyer, si les conditions sont réunies, avec les bons headers (type fichier, ...)
 
WRInaute occasionnel
J'ai apparamment trouvé une solution qui m'a été suggérée.
Je la poste cela servira peut -être:
En fait dans le répertoire contenant les morceaux, j'ai rajouté un htaccess contenant "deny from all" . Visiblement maintenant cela fonctionne. Free download manager n'arrive plus a telecharger le fichier , si je rentre le lien direct.
 
WRInaute accro
seabird a dit:
J'ai apparamment trouvé une solution qui m'a été suggérée.
Je la poste cela servira peut -être:
En fait dans le répertoire contenant les morceaux, j'ai rajouté un htaccess contenant "deny from all" .
sauf que plus personne n'arrivera à télécharger :cry:
 
WRInaute occasionnel
si si ca marche , je viens d'essayer en rentrant un code valide dans le formulaire allopass. Le script allopass passe à travers sans problème.
 
Nouveau WRInaute
seabird > T'es sur que ça marche? Parce que normalement un "deny from all", bah ça deny à tout le monde, y compris au php :?

Moi j'ai opter pour une solution toute faite : LogDownAP (http://logdown.free.fr)

C'est moins prise de tête et assez malin!

Mais ça n'engage que moi...
 
WRInaute occasionnel
Bien sur que cela marche php passe à travers deny from all.
par exemple tu crées un répertoire fichiers dans lequel tu mets tes fichiers protégés et qui contient ton htaccess avec ton deny from all.
A l'extérieur du répertoire tu mets ton script de téléchargement par exemple telechargement.php qui sera appelé et qui a la forme suivante:
Code:
$RECALL=$HTTP_GET_VARS["RECALL"];
 if (trim($RECALL)=="") 
 {
  // La variable RECALL est vide, renvoi de l'internaute
  //vers une page d'erreur
  header("Location: erreur.html");
  exit;
 }

 // $RECALL contient le code d'accès
 $RECALL = urlencode($RECALL); 

 // $AUTH doit contenir l'identifiant de VOTRE document
 $AUTH = urlencode("54/75/456");
 
 // $FICHIER_LOCAL doit contenir le chemin et le nom du fichier
 //à téléchargé présent sur votre site
 $FICHIER_LOCAL = "fichiers/fichier.zip";

 // $FICHIER_INTERNAUTE doit contenir le nom du fichier qui sera créé sur
 //l'ordinateur de l'internaute
 // Ce nom ne doit pas être forcément le même que le nom du fichier local !
 $FICHIER_INTERNAUTE = "autre_nom.zip";

 // envoi de la requête vers le serveur AlloPAss
 // afin de vérifier le code d'accès de l'internaute.
 // Dans la variable $r[0] on aura la réponse du serveur
 $r=@file("http://www.allopass.com/check/vf.php4?CODE=$RECALL&AUTH=$AUTH");

 // on test la réponse du serveur
 if (ereg("ERR",$r[0]) || ereg("NOK",$r[0])) 
 {
  // Le serveur a répondu ERR ou NOK : l'accès est donc refusé
  header("Location: erreur.html");
  exit;
 }

 // Le code est valide : on lance le téléchargement du fichier
 if (file_exists($FICHIER_LOCAL)==true) 
 {
  if (strstr($HTTP_USER_AGENT,"MSIE"))
   $attachment="";
  else
   $attachment=" attachment;";

  header( "Content-type: application/octet-stream" );
  header( "Content-Disposition:$attachment filename=$FICHIER_INTERNAUTE");
  header( "Content-Description: File Transfert" );
  header( "Content-Length: ".filesize($FICHIER_LOCAL).""); 
  readfile($FICHIER_LOCAL);
  exit;
 }

Tu rajoutes ta variable recall dans l'iframe de paiement qui ressemble à ça en gros:
Code:
http://payment.allopass.com/acte/scripts/iframe/right.apu?ids=164486&idd=451920&lang=fr&recall=1

Voila tout marche sans problème.
 
WRInaute accro
UrseneLapin a dit:
seabird > T'es sur que ça marche? Parce que normalement un "deny from all", bah ça deny à tout le monde, y compris au php :?
en fait, le deny ne fonctionne que pour un appel http. Quand c'est le serveur qui appelle directement le fichier (sous forme 'include), ce n'est pas apache qui traite les droits d'accès, mais linux (ou wxindows le cas échéant)
 
Discussions similaires
Haut