Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1053 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2119820
wade
Tester c'est douter
Posté le 05-01-2012 à 21:04:06  profilanswer
 

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 :)

mood
Publicité
Posté le 05-01-2012 à 21:04:06  profilanswer
 

n°2119835
wade
Tester c'est douter
Posté le 06-01-2012 à 02:13:02  profilanswer
 

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
n°2120285
nisalon_ca​je
Posté le 09-01-2012 à 17:00:17  profilanswer
 

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
n°2120345
pop-pan
yay!
Posté le 10-01-2012 à 01:23:44  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Recherche geographique sur mon site webcopier toutes les feuilles d'un ensemble de fichiers Excel
Problème de margin sur mon siteLes fichiers en C
Avoir une résolution universelle pour mon site web?Redirection automatique vers site indésirable...
Vérifier qu'une URL correspond bien à un site InternetFichiers de Localisation (Appli. Multi-Langues)
Trafic sur son site : quels objectifs se fixer ?VBA importation fichiers TXT
Plus de sujets relatifs à : Envoi de fichiers dans la zone privée d'un site, confidentialité ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR