Page 1 sur 1

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

Posté : 07 sept. 2010, 12:48
par enneite
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?

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

Posté : 07 sept. 2010, 13:05
par jojolapine
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

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

Posté : 07 sept. 2010, 16:13
par enneite
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.

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

Posté : 07 sept. 2010, 16:42
par stealth35
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 ?

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

Posté : 07 sept. 2010, 17:55
par enneite
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.

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

Posté : 07 sept. 2010, 18:01
par stealth35
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

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

Posté : 07 sept. 2010, 18:38
par enneite
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.

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

Posté : 09 sept. 2010, 19:40
par BaLiSTiK
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 :/

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

Posté : 09 sept. 2010, 19:47
par stealth35
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

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

Posté : 10 sept. 2010, 18:36
par cyruss
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.

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

Posté : 12 sept. 2010, 19:08
par stopher
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.