Envoi de fichiers dans la zone privée d'un site, confidentialité ?

Envoi de fichiers dans la zone privée d'un site, confidentialité ? - PHP - Programmation

Marsh Posté le 05-01-2012 à 21:04:06    

Bonjour :hello: ,
 
Sur la partie privée d'un des sites que je gère (php maison, pas de frameworks/libs/CMS...) je dois créer un envoi de fichiers qui n'est accessible que par le membre qui a fait l'upload (inaccessible par les autres).
 
Pour l'instant la technique que j'ai trouvé c'est :  
 
- Créer un hash MD5/sha1 en random à la création du compte, le stocker dans la table des utilisateurs
- Au premier upload de fichier par un membre créer le dossier /uploads/[hash]/ pour mettre le fichier dedans
- Interdire le listage des repertoires dans /uploads/
 
Les fichiers sont relativement confidentiels (pas du secret défense non plus hein :o) et je me demande si ma méthode est vraiment safe (à priori si personne ne peut lister les dossiers de /uploads/ il n'y a pas de risques ?).
Connaissez vous d'autres méthodes à ce niveau ? (pas de stockage en binaire dans la base de données, ce sont des gros fichiers < 2Mo).
 
Merci :)

Reply

Marsh Posté le 05-01-2012 à 21:04:06   

Reply

Marsh Posté le 06-01-2012 à 02:13:02    

Je m'auto-up :o
J'ai trouvé une fonction qui va me permettre de cacher le lien de téléchargement à mon utilisateur :
Source : http://php.net/manual/fr/function.header.php (commentaires)

Code :
  1. <?php
  2. function downloadFile( $fullPath ){
  3.   // Must be fresh start
  4.   if( headers_sent() )
  5.     die('Headers Sent');
  6.   // Required for some browsers
  7.   if(ini_get('zlib.output_compression'))
  8.     ini_set('zlib.output_compression', 'Off');
  9.   // File Exists?
  10.   if( file_exists($fullPath) ){
  11.    
  12.     // Parse Info / Get Extension
  13.     $fsize = filesize($fullPath);
  14.     $path_parts = pathinfo($fullPath);
  15.     $ext = strtolower($path_parts["extension"]);
  16.    
  17.     // Determine Content Type
  18.     switch ($ext) {
  19.       case "pdf": $ctype="application/pdf"; break;
  20.       case "exe": $ctype="application/octet-stream"; break;
  21.       case "zip": $ctype="application/zip"; break;
  22.       case "doc": $ctype="application/msword"; break;
  23.       case "xls": $ctype="application/vnd.ms-excel"; break;
  24.       case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  25.       case "gif": $ctype="image/gif"; break;
  26.       case "png": $ctype="image/png"; break;
  27.       case "jpeg":
  28.       case "jpg": $ctype="image/jpg"; break;
  29.       default: $ctype="application/force-download";
  30.     }
  31.     header("Pragma: public" ); // required
  32.     header("Expires: 0" );
  33.     header("Cache-Control: must-revalidate, post-check=0, pre-check=0" );
  34.     header("Cache-Control: private",false); // required for certain browsers
  35.     header("Content-Type: $ctype" );
  36.     header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";" );
  37.     header("Content-Transfer-Encoding: binary" );
  38.     header("Content-Length: ".$fsize);
  39.     ob_clean();
  40.     flush();
  41.     readfile( $fullPath );
  42.   } else
  43.     die('File Not Found');
  44. }
  45. ?>


Message édité par wade le 06-01-2012 à 02:13:23
Reply

Marsh Posté le 09-01-2012 à 17:00:17    

Je vois comme ça quelques solutions pour afficher l'image malgré qu'on ne soit pas l'utilisateur :

 

1. Récupérer le mot de passe de l'utilisateur (bon ok tu t'attendais pas à cette réponse)
2. une faille include qui permettrait d'inclure un peu n'importe quoi (donc faire un system("ls" ) et de déplacer les images dans un dossier accessible)
3. si ton hash est connu (j'ai du mal à comprendre ce que tu veux dire par "Créer un hash MD5/sha1 en random" puisqu'un hash est parfaitement déterministe) ou connaissable (recalculable), et si les noms des fichiers sont relativement triviaux (genre image0001.jpg), alors il est possible d'y accéder. D'ailleurs, si un jour tu affiches 1 image quelque part à un autre utilisateur, alors il connaitra ton hash ...

 

Ce que je te conseillerais :
- renommer aléatoirement les fichiers (et garder les traces des nouveaux noms dans la bdd) : si le hash est connu (genre une image est affichée quelque part) il n'est pas aisé de retrouver le nom des fichiers.
- ce que je ferai (il doit y avoir plus propre, vois si tu trouves quelque chose dans ce sens là) : quand ton utilisateur se connecte, tu prends son ip et tu la mets dans le .htaccess du dossier images (et tu la supprimes quand il se déconnecte ou reste pas présent pdt trop longtmeps)
Ainsi tu rajoutes dans ton .htaccess :
Order Deny, Allow
Deny From All
Allow From ip_du_visiteur_connecte

 

(vérifie la syntaxe)

 

Ainsi, même si on a ton hash et le nom de l'image, alors il ne sera pas possible de voir l'image si tu n'es pas connecté avec cette IP

 

Après pas persuadé que ce soit très "propre" de modifier un .htaccess à la volée, voyons ce que vont dire les autres !

 

A+


Message édité par nisalon_caje le 09-01-2012 à 17:02:09
Reply

Marsh Posté le 10-01-2012 à 01:23:44    

tu peux faire des trucs *simples* avec mcrypt() en blowfish par exemple.
une clef user pour definir son repository
une clef user de decryptage a la volée des fichiers au download (que tu cryptes a l'upload evidemment)
 
avantage, meme avec le chemin du repository les fichiers sont inexploitables
probleme, ca charge en cpu
 
evidemment si un user choppe les 2 clefs c'est chiant mais c'est plus le meme probleme.
 
a savoir que ca ne marche que si tu a des users authentifiés.
 
sinon si ton probleme c'est juste de cacher un chemin suffit de faire une function  ou tu envois juste le nom du fichier, (le path complet etant calculé a partir d'une clef user) et tu renvois le stream.
 
le repertoire les contenant physiquement etant lui inaccessible via http (deny from all) mais RW pour le user executant apache


---------------
[VDS] rail vesa, bras ecran, support TV / [ACH] des machins
Reply

Sujets relatifs:

Leave a Replay

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