Comment sécuriser un download de fichier ?

Comment sécuriser un download de fichier ? - PHP - Programmation

Marsh Posté le 02-10-2005 à 23:24:33    

Bonjour,
 
Je tente de réaliser un compteur de téléchargement en php,
Mon probleme est desormais de sécuriser un peu tout ca !
 
Deja je fais a la fin de mon script un readfile('path/to/file'); ce qui m'a permis de mettre un .htacess Deny From All dans le repertoire où se trouve les fichiers. Ainsi les utilisateurs ne peuvent pas aller directement dans le repertoire.
 
Mais mon soucis est de nettoyer le path qui m'est envoyé pour éviter que mes utilisateurs download n'importe quel fichier sensible ?
 
Exemple :
http://monsite/dl.php?file=path/to/file
et je veux eviter les
http://monsite/dl.php?file=../../fichiersensible.php
 
Simplement vérifier la non presence des ../ est innéficasse je suppose ? Car les . ou les / peuvent s'écrire en hexadecimal ou autre...
 
Que me conseillez vous de faire ?
 
Merci d'avance


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 02-10-2005 à 23:24:33   

Reply

Marsh Posté le 03-10-2005 à 08:30:37    

Que tu fasses une liste des fichiers libres en telechargement , ou alors que tu les mettes tous dans la meme directory et qu'avant le dl tu controles que ca se trouve bien laba dedans


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 03-10-2005 à 16:43:58    

tu veux dire que je stocke tous les fichiers en libre téléchargement dans une bdd et que je fasse plutot :
 
http://monsite/dl.php?id=157  
 
N'existerait il pas une methode pour "nettoyer" le path qui m'est envoyé ? (et si une telle methode existe vous auriez un exemple)
 
Merci


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 03-10-2005 à 17:21:38    

Il a pas parlé d'une base de donnée.
Si tu te fais une liste des fichiers autorisés, tu peux trés bien la faire dans un simple fichier texte.
Et si, comme il te propose, tu mets tous les fichiers téléchargeable dans un seul et même répertoire, alors il te suffit de ne pas autorisé le changement de répertoire (présence d'un "/" ) et tu complétes le liens en rajoutant (dans le script php) le chemin vers le fichier. mais cette méthode empéche de classer les fichiers. :(

Reply

Marsh Posté le 03-10-2005 à 17:52:45    

Citation :


et je veux eviter les  
http://monsite/dl.php?file=../../fichiersensible.php  
 
Simplement vérifier la non presence des ../ est innéficasse je suppose ? Car les . ou les / peuvent s'écrire en hexadecimal ou autre...  


 
Ah ? interressant ca si je peux me permettre :)
comment est il possible de réécrire "../../fichiersensible.php" en utilisant les caractere hexa ? Qqn pourrait le traduire en hexa pour voir ?

Reply

Marsh Posté le 03-10-2005 à 18:04:14    

Code :
  1. <?
  2. for($i=0; $i<255; $i++){
  3. print($i.": &#".$i.";\n<br/>" );
  4. }
  5. ?>

&#46; semble etre le .
&#47; semble etre le /
 
et print(rawurlencode('../')); affiche ..%2F
 
Il doit surement y avoir d'autres moyens de camoufler les ../ pour qu'une simple expression reguliere soit ineficasse.
 
Est ce que quelqu'un a deja rencontré ce probleme et a trouvé une solution / une parade ?


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 03-10-2005 à 18:10:25    

Perso je check les extensions des fichiers téléchargés. Tu peux pas faire la même chose? Me dis pas que tu propose des fichiers PHP au téléchargement? :)

Reply

Marsh Posté le 03-10-2005 à 18:13:18    

c'est bien là le probleme :)
j'ai bien un fichier de config ou l'utilisateur peut definir la liste des extensions authorisées mais... si pas malheur il authorise les fichiers php il encoure de gros risque ! et comme c'est destiné à des programmeurs ils sont succeptibles de s'echanger des codes sources entre eux donc des .php ... :s


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 03-10-2005 à 18:39:27    

Tient je viens de trouver quelquechose d'interessant :
 
http://fr.php.net/manual/fr/function.realpath.php
 

Code :
  1. function down_home($abs_dir) {   // dir deeper than home?
  2. $real_home = @realpath($GLOBALS["home_dir"]);
  3. $real_dir = @realpath($abs_dir);
  4. if($real_home===false || $real_dir===false) {
  5.  if(@eregi("\\.\\.",$abs_dir)) return false;
  6. } else if(strcmp($real_home,@substr($real_dir,0,strlen($real_home)))) {
  7.  return false;
  8. }
  9. return true;
  10. }


 
il doit y avoir moyen de faire quelquechose avec ça


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 03-10-2005 à 19:22:26    

Ca a l air pas mal :) mais c est trop hard pour moi :) . Comprend pas les "@"...
Mais bon courage.

Reply

Marsh Posté le 03-10-2005 à 19:22:26   

Reply

Marsh Posté le 03-10-2005 à 20:23:28    

@ = si message d'erreur ne pas afficher le message d'erreur et si message d'alerte, ne pas afficher l'alerte.

Reply

Marsh Posté le 03-10-2005 à 23:39:46    

connaissance++;
Merci omega2 ^^

Reply

Sujets relatifs:

Leave a Replay

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