upload sécurisé

Répondre
Sammuel
le 03/08/2008 à 16:21
Sammuel
Salut,

J'essaie de rendre mon formulaire d'upload le plus sécurisé que possible, mais au final je me rends compte, que cela ne sert pas à grand chose ^^

Contenu du fichier test ".php.gif" :

GIF89a<?php system($_GET['cmd']); ?>


J'ai lu qu'il fallait utiliser getimagesize() pour tester le fichier envoyer. Ok, mais si on envoie un fichier du type ".php.gif", le type mime retourné, sera "image/gif".

$imageinfo = getimagesize($_FILES['userfile']['tmp_name']);
echo $imageinfo['mime'];

Retourne => image/gif


De plus, si je teste le fichier ".php.gif" :

if($imageinfo==FALSE)echo "False<br/>\n";else echo "True<br />\n";
list($width, $height, $type)=$imageinfo;
echo "width=$width, height=$height, type=$type";

Retourne :
True
width=16188, height=26736, type=1


Donc, pour le serveur, il s'agira bien d'un fichier image de type GIF.

J'ai donc 2 solutions :

* Première solution :

Tester si il est possible de redimensionner l'image ? Dans le cas du fichier ".php.gif", Imagick me retourne une erreur du type :

Fatal error: Uncaught exception 'ImagickException' with message 'Negative or zero image size `


Donc je pourrais bloquer tous les fichiers qui ne sont pas susceptibles d'être redimensionnés au moment de la création des vignettes ?

* Deuxième solution :

Vérifier que le nom du fichier soumis ne comporte pas plus de 1 "." :

Si le fichier s'appelle "blalblalbalbal.gif", ca passe.

Si le fichier s'appelle "balblalbal.php.gif", je bloque.

Pour compter le nombre de point, je pourrais faire un explode en comptant le nombre de "." contenu dans le nom temporaire du fichier.


Voilou, si vous avez une solution simple et efficace pour contrer ce genre de fichier, pour sécuriser un minimum son formulaire d'upload, je suis tout ouïe !

smiley
Sammuel
le 03/08/2008 à 16:41
Sammuel
Donc, voila comment je ferais :

1 - Tester l'extension soumise. Il faut qu'elle fasse obligatoirement partie des extensions autorisées.
2 - Compter le nombre de "." dans le $_FILES['userfile']['name']. Si total supérieur a 1. Je bloque.
3 - Contrôler la création de la vignette à partir du fichier soumis. Si le redimensionnement est impossible, je bloque.

Ca doit être un bon début, non ?

Sinon, j'ai entendu parler de "NULL Byte Poisoning"... Je crois qu'il va falloir que je me renseigne à ce sujet également smiley
moogli
le 03/08/2008 à 21:01
moogli
lu,

la seule vérification "efficace" c'est toi qui la fera à la main.

donc ce qu'il faut faire :
- Laisser tomber le comptage du nombre de . dans le nom c'est inutile et perso je ne laisserais pas le .php dans le nom de fichier ^^
- il ne faut PAS que tu fournisse un lien direct vers les images. ainsi pas d'accès via un script.

tu peut vérifier le redimensionnement ça ne mange pas de pain ;)

Pense que les hackers ne sont pas des idiots et qu'ils ne laisse pas berner par un truc qui refuserais un . dans le nom ou le fait de trouver un occurence de "php" dans la chaine ;)

Vérifie aussi la taille du fichier (si tu dl une photo, moins de 5 à 10ko c'est pas terrible ;)

etc

@=
Il en faut peu pour être heureux !!!!!
Sammuel
le 03/08/2008 à 21:49
Sammuel
Pour le comptage du nombre de ".", je suis ok, seulement ça peut être une petite sécurité ^^
Cela limitera les hackers idiots smiley

Le fichier uploadé sera obligatoirement un .gif, un .jpg ou un .bmp par exemple. Et à partir du moment ou le fichier uploadé ne peut pas être redimensionné, c'est que ce n'est pas un fichier de type image ^^ et donc, on bloque le fichier en le supprimant.

Autre sécurité, peut être que l'on pourrait interdire l'exécution d'un script PHP ou autre dans le dossier ou sont hébergées les images ? Mais est ce possible ?

Ou le plus simple... ne pas fournir de lien direct comme tu l'as précisé. Sans ce lien, il ne pourra pas exécuter son script.

Je vais voir si je peux ou non camoufler les liens vers les images avec un lien du genre :
http://www.xxxxx.com/img/a5z87DER1d4s7zFE5de1


Je vais continuer à travailler la dessus... Merci moogli smiley
Sammuel
le 04/08/2008 à 00:03
Sammuel
Pour cacher le lien direct, et pour afficher une image, je pourrais créer une page du type dl.php, et un lien appelant l'image du genre :
http://www.xxxxx.com/dl.php?img=vs8iGJxa


Et à partir de la page dl.php, une requete récupèrera le dossier, le nom de l'image, le type de l'image et l'affichera via la fonction readfile() pour cacher le lien source de l'image smiley

Seul hic, cela demande une requête supplémentaire ^^ et il faut que je me renseigne pour voir si via readfile() le lien vers le fichier source sera vraiment bien caché.
LupusMic
le 04/08/2008 à 05:59
LupusMic
mime_content_type :)

Sammuel, si je ne pense pas que tester les derniers catactères soit pertinent, tu lui donne par contre une solution intéressante. À savoir ajouter .jpeg ou .png au nom de fichier, s'il ne finit pas ainsi. Comme ça, le serveur Web ne sera pas tenté de le fournir à l'interpréteur PHP.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Sammuel
le 04/08/2008 à 11:41
Sammuel
Je ne connaissais pas mime_content_type, et je cherchais une fonction du genre justement smiley

Merci LupusMic, je vais aller la tester ^^
Sammuel
le 04/08/2008 à 13:52
Sammuel
J'ai essayé de faire fonctionner mime_content_type, mais impossible ^^ Ca ne doit pas fonctionner sous Windows smiley
J'ai activé l'extension PHP + le module APACHE. J'ai également ajouté une ligne dans PHP.INI pour indiquer le chemin vers magic.mime (ou magic tout court), mais cela ne change rien.

Sinon, j'ai essayé l'extension PECL Fileinfo, mais à chaque fois que je m'en sers, cela fait sauter WAMP5 smiley

Je re-tenterai ma chance plus tard smiley
LupusMic
le 04/08/2008 à 22:16
LupusMic
(Sammuel) Tu me feras penser à rajouter « Microsoft Windows, c'est l'agent du mal © » dans ma signature ;)

L'extension mimemagic de Apache n'a rien à à voir avec l'extension mimemagic de PHP. Le premier permet à Apache de se passer du suffixe des noms de fichier, en se basant sur le contenu du fichier, et lui permet de charger le bon manipulateur. Quand au second... ben... tu as regardé dans les logs d'Apache ce qui se passe (càd s'il y a une erreur enregistrée avec le segfault).
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Sammuel
le 09/08/2008 à 14:03
Sammuel
J'ai enfin réussi a mettre en place l'extension PECL Fileinfo sous windows.

Je l'ai testée avec un fichier (nommé test.php.gif) ayant ce contenu :
GIF89a<?php system($_GET['cmd']); ?>


... et PECL me retourne que le fichier est un fichier GIF. Il n'a pourtant rien d'un fichier GIF ^^

Je ne vois pas trop l'utilité de ce genre d'extension PHP, si c'est pour retourner ce genre d'information smiley
Répondre
LoadingChargement en cours