70 votes

Liste de contrôle de sécurité de téléchargement d'image PHP

Je suis de la programmation d'un script d'upload d'images pour mon application. Sont les suivantes étapes de sécurité suffisamment pour en faire la demande à l'abri de l'script côté?

  • Désactiver PHP en cours d'exécution à l'intérieur du dossier de téléchargement à l'aide .httaccess.
  • Ne pas autoriser le transfert si le nom de fichier contient la chaîne "php".
  • Autoriser uniquement les extensions sont: jpg,jpeg,gif et png.
  • Autoriser uniquement type de fichier image.
  • Interdire image avec deux type de fichier.
  • Changer le nom de l'image.
  • Télécharger vers un sous-répertoire ne répertoire racine.

C'est mon script:

 $filename=$_FILES['my_files']['name'];
 $filetype=$_FILES['my_files']['type'];
 $filename = strtolower($filename);
 $filetype = strtolower($filetype);

 //check if contain php and kill it 
 $pos = strpos($filename,'php');
 if(!($pos === false)) {
  die('error');
 }




 //get the file ext

 $file_ext = strrchr($filename, '.');


 //check if its allowed or not
 $whitelist = array(".jpg",".jpeg",".gif",".png"); 
 if (!(in_array($file_ext, $whitelist))) {
    die('not allowed extension,please upload images only');
 }


 //check upload type
 $pos = strpos($filetype,'image');
 if($pos === false) {
  die('error 1');
 }
 $imageinfo = getimagesize($_FILES['my_files']['tmp_name']);
 if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg'&& $imageinfo['mime']      != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
   die('error 2');
 }
//check double file type (image with comment)
if(substr_count($filetype, '/')>1){
die('error 3')
}

 // upload to upload direcory 
 $uploaddir = 'upload/'.date("Y-m-d").'/' ;

if (file_exists($uploaddir)) {  
} else {  
    mkdir( $uploaddir, 0777);  
}  
  //change the image name
 $uploadfile = $uploaddir . md5(basename($_FILES['my_files']['name'])).$file_ext;



  if (move_uploaded_file($_FILES['my_files']['tmp_name'], $uploadfile)) {
 echo "<img id=\"upload_id\" src=\"".$uploadfile."\"><br />";
  } else {
   echo "error";
  }

Toutes les astuces sont les bienvenues :)

37voto

Halil Özgür Points 5486

Re-traitement de l'image à l'aide de GD (ou Imagick) et enregistrer l'image traitée. Tous les autres sont juste amusant ennuyeux pour les pirates.

Edit: Et comme rr souligné, utilisez move_uploaded_file() pour tout télécharger.

Fin Edit: au fait, vous voulez être très restrictives au sujet de votre dossier de téléchargement. Ces lieux sont l'un des coins sombres où de nombreux exploits arriver. Ceci est valable pour n'importe quel type de télécharger et de tout langage de programmation/serveur. Vérifier https://www.owasp.org/index.php/Unrestricted_File_Upload

13voto

tanjir Points 559

Pour le test de sécurité des fichiers d'image, je pense, de 4 niveaux de titres. 3 et 4 sera lente (n'est pas recommandé sauf si vous travaillez sur de très sécurisé/gouv projet). Ils doivent être:
Niveau 1: Vérifier l'extension (extension de fichier se termine avec)
Niveau 2: Vérifier le type MIME ($file_info = getimagesize($_FILES['image_file']; $file_mime = $file_info['mime'];)
Niveau 3: Lire les 100 premiers octets et de vérifier s'ils ont des octets dans la plage suivante: ASCII de 0 à 8, 12 à 31 (décimal).
Niveau 4: Vérifier les numéros de magie dans l'en-tête (première de 10 à 20 octets du fichier). Vous pouvez trouver certains des fichiers d'en-tête d'octets à partir d'ici: http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Examples

9voto

Rok Kralj Points 11593

XSS Avertissement

Un plus très important remarque. Ne servent pas/télécharger quoi que ce soit qui pourrait être interprété comme du HTML dans le navigateur.

Étant donné que les fichiers sont sur votre domaine, javascript contenues dans ce document HTML aurez accès à tous vos cookies, permettant à une sorte d'attaque XSS.

Scénario d'attaque:

  1. L'attaquant upload de fichier HTML avec du code JS qui envoie tous les cookies de son serveur.

  2. L'attaquant envoie le lien à vos utilisateurs via mail, MP, ou via une iframe sur son site ou tout autre site.

La plus sûre solution:

Faire du contenu téléchargé disponible uniquement sur le sous-domaine ou sur un autre domaine. De cette façon, les cookies ne sont pas accessibles. C'est aussi l'un des google des conseils de performances:

https://developers.google.com/speed/docs/best-practices/request#ServeFromCookielessDomain

7voto

jloa Points 41

Créez un nouveau fichier .htaccess dans le répertoire uploads et collez ce code:

 php_flag engine 0
RemoveHandler .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
AddType application/x-httpd-php-source .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
 

Assurez-vous simplement de renommer les fichiers que vous téléchargez et oubliez de vérifier les types, le contenu, etc.

6voto

rr. Points 2268

Vous voudrez peut-être aussi exécuter "is_uploaded_file" sur le fichier $ _FILES ["mes_fichiers"] ["nom_mpT"]. Voir http://php.net/manual/en/function.is-uploaded-file.php

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X