Bonjour,
J'ai crée en PHP un système d'upload d'images.
Pour des raisons de sécurité, j'ai décidé de refuser toutes les images dont les 1ers octets (numéro magique) ne correspondent pas à une image jpeg ou gif.
Seulement cette protection ne suffit pas : En effet, un fichier peut débuter avec le numéro magique d'un gif (et sera donc accepté), puis peut être suivi de code malicieux comme du PHP...
Pour éviter ce problème, j'ai procédé comme cela:
- Les fichiers uploadés sont stockés en dehors du répertoire web (donc pas accessible directement)
- J'ai crée un fichier image.php?name=image_name , dont voici une version simplifiée:
Puis donc après dans ma page:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $name = $_GET['name']; $pic = '/myFolder/'.$name; /*Note: On teste le nom du fichier pour savoir si il existe, et pour protéger de tout parcours de répertoire (autoriser uniquement des fichiers existants qui sont dans un répertoire précis) -- Pas précisé ici toutes les vérifications pour alléger l'exemple*/ header("Content-Type: image/gif"); //ou jpeg si jpeg readfile($pic);
Le problème est donc résolu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <img src="image.php?name=image_18" alt="mon image"/>
J'aimerai ensuite créer des miniatures. J'aimerai savoir si le code suivant protége aussi contre une telle faille :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 //On récupere le nom du fichier à afficher (avec les memes protection que citées dans le code précédént) $name = $_GET['name']; $pic = '/myFolder/'.$name; header("Content-Type: image/gif"); //ou jpeg si jpeg //On récupère les infos sur l'image $info_img = @getimagesize($pic); if(!$info_img ) { exit(); } //Creation de la miniature $img_out = imagecreatetruecolor(100, 100); $img_in = imagecreatefromgif($pic); imagecopyresampled($img_out, $img_in, 0, 0, 0, 0, imagesx($img_out), imagesy($img_out), imagesx($img_in), imagesy($img_in)); imagegif($img_out);
Autre petite question: De telles protection empecherait par exemple l'éxécution de code PHP. Mais est-ce pareil pour du code JS? (faille XSS). Si non, comment protéger?
Merci d'avance pour vos réponses.
Partager