Sécuriser l'upload de fichier en PHPde manière rigoureuse

Eléphant du PHP | 245 Messages

07 sept. 2010, 12:48

Bonjour,
j'aimerais sécuriser l'upload de fichiers.

Pour l'instant je fais des tests sur les fichiers .csv, mais je compte l'élargir aux pdf, voir aux .doc...

Mon code actuel est
$t = $_FILES["fichier"];
//print_r($t);
$name=$t["name"];
$tmp_name=$t["tmp_name"];

$erreur=false;
if($t["error"]>0)$erreur="ERREUR code erreur = ".$t["error"];
//1 ere verif : moyennement fiable
$extension = strrchr($name, '.');
if($extension!=".csv")$erreur="<H1>ERREUR : Le fichier n'est pas au format CSV</H1>";


if($erreur!==false)
{
	echo $erreur;exit;
}
Mais une simple vérification de l'extension ne me satisfait pas.
Ce que j'aimerais c'est avoir un analyseur de fichiers coté PHP qui puisse déterminer le type MIME.

Apparament la fonction finfo_file() et toutes ses consoeurs correspondrait à mes besoins.


Mais je ne peux pas l'utiliser :

Fatal error: Call to undefined function finfo_open() in C:\repertoire\text.php on line 39

Je suis sous Windows et j'ai une version de PHP 5.1
Je ne sais pas à quelle extension est liée cette fonction, je pensait que c'etait php_fileinfo.dll

Mais après avoir
- téléchargé la dll sur http://dllcentral.com/php_fileinfo.dll/5.2.5.5/
- copié/collé la dll dans le repertoire ext/ à coté de toutes mes autres extensions
- puis en ayant rajouter l'extension dans mon fichier php.ini
- puis en ayant redémarré apache

, je tombe toujours sur la même fatal error, j'ai aussi essayé avec php_filepro.dll, cela me fait toujours pareil

bref, je ne sais plus à quelle bibliothèque me fier.

Quelqu'un pourait-il me dire comment installer la fonction finfo_open()?
Et de manière plus général quelqu'un pourrait-il me dire si je fais fausse route et comment analyse-t-on les fichiers uploadés en PHP de manière plus élaborée que la vérification de l'extension?

ViPHP
ViPHP | 3607 Messages

07 sept. 2010, 13:05

Bonjour, tu ne pourras pas en l'état utiliser cette fonction:
finfo_file

(PHP >= 5.3.0, PECL fileinfo >= 0.1.0)
Voilà pour l'installation: http://fr.php.net/manual/fr/fileinfo.setup.php

Eléphant du PHP | 245 Messages

07 sept. 2010, 16:13

merci Jojo, mais mon problème demeurre inchangé.

Installation des fonctions finfo() pour PHP sous windows.

- j'ai téléchargé la version de php 5.3 pour récupérer la dll : php_fileinfo.dll
- J'ai copié la dll avec les autres extensions sous le répertoire de PHP "ext/"
- J'ai ajouté la ligne d'extension au php.ini :
extension=php_fileinfo.dll
- j'ai suivi les instructions de du site
http://fr.php.net/manual/fr/fileinfo.installation.php
Notament j'ai copié collé magic et magic.mime sous le répertoire "extra/" de PHP et j'ai cré une variable d'environnement intitulée:
intitulée MAGIC avec ce dossier : D:\Program Files\php-5.1.2\extras\magic
Mais je ne peux plus avancer car j'ai toujours la même erreur :

Fatal error: Call to undefined function finfo_open() in C:\www\enregistrer_retours_emailstrategie.php on line 40

Ce qui pour moi signifie que la fonction ne fait pas partie de cette version de l'extension, puisque PHP ne sait meme pas que la fonction est definie.
Or j'ai pris soin de télécharger php 5.3 en zip sur http://windows.php.net/download/ pour etre sur que la dll soit bonne.
Et j'ai copié cette extension à coté des autres dans mon PHP 5.1
Et php ne reconnait pasla fonction???
Toutes les autres fois où j'ai rajouté des extensions, PHP au moins reconnaissait que la fonction existait bien, là il ne la reconnait même pas!
C'est cela que je trouve bizzarre.
Qu'il la reconnaisse et que j'ai un autre message d'erreur pourquoi pas, mais là non, il nme met que la fonction est indéfinie alors que la dll existe, l'extension est active et que le serveur est redémarré.
Du coup je me dis que la dll utilisée n'est peut être pas bonne. Mais c'est la dll copié collée du package php 5.3
DOnc même si mon PHP n'est qu'en 5.1, cela devrait suffire pour reconnaitre la fonction.
A moins qu'il y ait une autre dll à installer mais cela n'est pas indiqué dans la doc.

ViPHP
ViPHP | 5462 Messages

07 sept. 2010, 16:42

faut affiché les erreur au demarage de php,
sinon filefinfo il est dans package msi, pas besion de prendre un dll,
mais a tu pris le bon, vc6 ? vc9 ? nts ? pas nts ?

Eléphant du PHP | 245 Messages

07 sept. 2010, 17:55

bah en fait : je viens de voir une erreur effectivement quand je lance php en ligne de commande :
"le point d'entrée de procédure prce_get_compiled_regex_cache est introuvable dans la bibliothèque de liens dynamiques php5ts.dll"
du coup à l'execution j'ai un warning :
"PHP Warning : PHP startus : Unable to load dynamic library 'C:\Program Files\php-5.1.2\ext\php_fileinfo.dll
La procédure spécifiée est introuvable. In Unknown in line 0"

Bref, un beau charabia pour moi qui me dit en gros que ma version de PHP est trop vieille pour charger l'extension php_fileinfo.dll

Du coup je peux mettre à jour ma version de PHP, mais si je me mets au php 5.3, il faudra uqe j'utilise apache 2.2 alors que je suis en 2.0 et que je répertorie tous les tuning apache et php que j'ai fait.
Ca ne m'enchante pas mais je ne sais pas s'il y a un autre moyen.

ViPHP
ViPHP | 5462 Messages

07 sept. 2010, 18:01

tu l'as pris où le php_fileinfo.dll ?

EDIT : sinon pour trouvé l'extension c'est avec pathinfo
EDIT 2 : je viens de voir ou tu la pris, c'est donc pas la bonne version..., il faut prendre la version pecl de l'époque (5 ans, il serai temps de mettre a jour)

en quoi mettre apache 2.2 est un problème ? sinon tu peu toujours mettre la dernier version de la 5.2

Eléphant du PHP | 245 Messages

07 sept. 2010, 18:38

mais si je télécharge une version ici :
http://pecl.php.net/package/Fileinfo

1) je ne sais déjà pas laquelle choisir.
2) je ne sais pas comment installé ces pecl

Là je t'avoue, cela commence à être un peu technique pour moi.
Mais bon, je vais essayé, l'installation des pecl ca marche comment?
Est ce possible au moins sur windows?

c'est peut être plus simple de passer à php 5.3 et apache 2.2
Mais dans ce cas, il faut que je vérifie que tout mon tuning fait sur php 5.1 et apache 2.0 puisse être adapté à une nouvelle version.
Bref, en gros, y a du boulot.

sinon, j'ai essayé de faire marcher la fonction mime_content_type(), elle ne me renvoie pas d'erreur puisqu'elle ne me renvoie rien! mais ça c'est une autre histoire.

Eléphant du PHP | 398 Messages

09 sept. 2010, 19:40

Pour vérifier le type MIME, j'utilise la librairie PEAR Mime_Type mais j'avoue que même si elle fonctionne nickel en local, je n'attive pas à la faire fonctionner sur mon serveur :/
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

ViPHP
ViPHP | 5462 Messages

09 sept. 2010, 19:47

sinon, j'ai essayé de faire marcher la fonction mime_content_type(), elle ne me renvoie pas d'erreur puisqu'elle ne me renvoie rien! mais ça c'est une autre histoire.
pas sur mais je crois que pour cette fonction il faut definir le path vers le mime.magic avec mime_magic.magicfile

Administrateur PHPfrance
Administrateur PHPfrance | 658 Messages

10 sept. 2010, 18:36

Salut,

est ce que tu ne peux pas utiliser le champs types de ta super globale $_FILES :

Code : Tout sélectionner

$_FILES['userfile']['type']
The mime type of the file, if the browser provided this information. An example would be "image/gif". This mime type is however not checked on the PHP side and therefore don't take its value for granted.
Co-auteur du livre PHP 7 avancé
Co-auteur du livre Performances PHP : Audit et optimisation LAMP
Co-fondateur de l'Association Française des Utilisateurs de PHP http://www.afup.org
Formateur PHP pour Openska

ViPHP
ViPHP | 1136 Messages

12 sept. 2010, 19:08

Slt ,

Sinon , pour prendre encore moins de risques , sur l'upload des fichiers , apres vérification extension , type mime de façon plus ou moins fiable , tu devrais en plus le rendre inaccessible des internautes directement ( lien direct par l'url ).

Il est conseillé de les stocker dans un répertoire ou seul php peut y accéder .

Bonne continuation ,
Ch.