Aller au contenu
equids

Vérifier un fichier d'upload

Noter ce sujet :

Recommended Posts

Bonjour à tous,

j'ai eu un souci à cause d'un formulaire d'envoi de photo sur un site.

J'ai mis en place une vérification du fichier envoyé (on l'appellera "fichier" lol), mais elle ne doit pas être assez bonne vu que quelqu'un a pu carrément balancer un dossier et une page php contenant un trojan (c'est Kaspersky qui l'a detecté quand j'ai analysé cette page).

D'ailleurs, c'est surement à travers cette page php que le dossier à été installé (enfin j'espère !)

Voila le code que j'utilise pour vérifier si l'image envoyé en est bien une :

list($largeur, $hauteur, $type, $attr)=getimagesize($_FILES['fichier']['tmp_name']);

//ON TESTE SI LE FICHIER EST DE TYPE 1 : GIF, OU 2 / JPG, OU 3 : PNG
if($type===1 OR $type===2 OR $type===3) { --ok-- }

J'ai ajouté une verification d'extension (après le souci):


$extensions_OK = array('jpg', 'jpeg', 'gif', 'png'); // LES EXTENSIONS ACCEPTEES
$ext = strtolower( pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION) );
// VERIFICATION D'EXTENSION DU FICHIER
if(in_array($ext, $extensions_OK))
{ -- ok --}

Qu'est ce qui ne va pas ou ne suffit pas dans ce code ?

Merci

Modifié par equids

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

Tu vérifies le type Mime et l'extension : tu ne peux pas faire grand chose de plus. De toutes façons, aucune de ces deux vérifications n'est fiable.

Tu nous dis que tu as ajouté une vérification d'extension : désormais, le problème ne devrait plus se produire. Mais quoiqu'il en soit, quand tu enregistres les fichiers uploadés sur ton serveur, il est préférable de les enregistrer sans extension.

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci de ta réponse,

je ne comprends pas un truc : ce n'est pas fiable mais on ne peut pas faire grand chose ?

Il n'y a aucun moyen de vérifier avec certitude qu'un fichier uploader par un visiteur est bien une image ?

Pour le fait de ne pas enregistrer les extensions, ça ne gêne pas l'utilisation des fichiers après ?

Quelle est l'utilité de ne pas les enregistrer ?

Partager ce message


Lien à poster
Partager sur d’autres sites
je ne comprends pas un truc : ce n'est pas fiable mais on ne peut pas faire grand chose ?

Il y a sûrement des possibilités plus complexes pour vérifier la validité d'un fichier, mais juste en php, il n'y a à ma connaissance aucune méthode fiable. Certains ont eu l'idée d'exécuter la fonction getimagesize() sur le fichier uploadé pour s'assurer qu'il renvoyait quelque chose (auquel cas on pourrait croire que c'est bel et bien une image), mais même ça, c'est assez facile à contourner pour un hacker qui s'y connaît un petit peu.

Le type mime est évidemment très facile à falsifier, et l'extension, n'en parlons même pas.

Pour le fait de ne pas enregistrer les extensions, ça ne gêne pas l'utilisation des fichiers après ?

Une image, même sans extension, sera très bien affichée dans une balise img : <img src="monimage" alt="truc" /> Le mieux, c'est de renvoyer l'image via un script qui s'occupera de générer les entêtes qui vont bien (notamment le type). Idem pour n'importe quel type de fichier (pdf, vidéo ou autre).

Quelle est l'utilité de ne pas les enregistrer ?

Il est quasi-indispensable de renommer tous les fichiers uploadés (avec ou sans l'extension), ne serait-ce que pour de simples raisons de gestion : en général on le renomme suivant l'identifiant correspondant dans la base de données. Ca évite aussi d'avoir des noms de fichiers avec des caractères exotiques (qui peuvent aussi provoquer des effets indésirables), etc...

Si on sait exactement ce qu'on fait de nos fichiers, pour quelle raison on les met dans un répertoire et pour quelle utilisation ultérieure (affichage d'une image, téléchargement d'un pdf, encodage d'une vidéo, etc), alors l'extension devient très facultative, et je pense qu'il inutile de s'embarrasser avec. Mais bien sûr, dans certains cas, elle peut être nécessaire.

Mais en tout cas, ce qui est absolument certain, c'est de ne jamais stocker le fichier tel quel, avec son nom et son extension, si tu ne fais pas au préalable une vérification de cette extension. C'est apparemment ce que tu as fait, mais maintenant, avec la vérification que tu as ajoutée, ça ne devrait plus se reproduire ;)

Modifié par Ernestine

Partager ce message


Lien à poster
Partager sur d’autres sites

Un peu de lecture intéressante (en anglais) à ce sujet :
/>http://www.scanit.be/uploads/php-file-upload.pdf

en espérant que ça aide un peu...

b0b0

Partager ce message


Lien à poster
Partager sur d’autres sites

Très intéressant ton lien effectivement,

il y a quelque chose que je n'ai pas saisi, en quoi ce code empêche l'upload d'une image qui comporterait du code php ?

$blacklist = array(".php", ".phtml", ".php3", ".php4");
foreach ($blacklist as $item) {
if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {
echo "We do not allow uploading PHP files\n";
exit;
}
}

La on ne vérifie que le nom du fichier non ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, cela ne vérifie que l'extension.

Il y a un truc que je ne comprends pas. L'article dit

A malicious user can upload a PHP file, such as a PHP shell and execute arbitrary commands on the server with the privilege of the web server process.

Si le fichier à une extension d'image (gif, png, jpg), je ne pense pas qu'il soit correct de dire qu'il suffit d'appeler le fichier avec un navigateur pour exécuter le code PHP qu'il contient... Sauf évidemment si le serveur web est configuré pour exécuter du PHP avec n'importe quelle extension, mais ce ne devrait pas être le cas.

Jean-Luc

Partager ce message


Lien à poster
Partager sur d’autres sites

D'après ce que j'ai compris, la personne utiliserait un script Perl pour générer l'upload qui lui permettrait de présenter le fichier comme étant une image, mais que l'enregistrement se fasse bien en php :

$res = $ua->request(POST 'http://localhost/upload3.php',
Content_Type => 'form-data',
Content => [
userfile => ["crocus.gif", "crocus.php", "Content-Type" => "image/gif"],]

Mais je n'ai pas bien compris sa méthode pour le contrer, vérifier le nom du fichier qui est présenté sous une extension ".gif ou .jpg", je n'en vois pas l'intérêt dans ce cas.

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×
×
  • Créer...