Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Controler le type de fichier envoye par un formulaire

10 réponses
Avatar
Thief13
Bonjour à tous !

Voilà, je suis confronté à un gros problème : il faut que je contrôle le
type de fichier envoyé par un formulaire, pour vérifier que la personne
n'envoie que des fichiers autorisé.

Seulement, je me suis rendu compte après quelques tests que le contrôle
par mime-type ou par extension est largement insuffisant, car il suffit
de changer l'extension pour trafiquer ces informations.

Premièrement, est il possible de vérifier qu'un fichier est un binaire,
(après quelques test, il m'a semblé que le jpg, le png et le gif sont
binaire) ou du texte ?

Apres est il possible de déterminer le type de binaire ? (Image, exe
Windows ou linux, elf...)

Merci d'avance pour votre aide.

10 réponses

Avatar
Olivier Miakinen

Voilà, je suis confronté à un gros problème : il faut que je contrôle le
type de fichier envoyé par un formulaire, pour vérifier que la personne
n'envoie que des fichiers autorisé.


La commande file sur Unix fait ça. Pour chaque type de fichier, en
fonction en général des quelques premiers octets, elle peut te dire si
c'est un texte ASCII, une image PNG ou JPEG, un exécutable, et ainsi de
suite.

Premièrement, est il possible de vérifier qu'un fichier est un binaire,
(après quelques test, il m'a semblé que le jpg, le png et le gif sont
binaire) ou du texte ?


Pour le texte, tous les jeux compatibles avec ASCII¹ partagent la
caractéristique selon laquelle la plupart des codes de contrôle entre
00 et 1F (hexa) en seront absents. En particulier tu ne peux jamais
trouver le code NUL (00). En principe, tu ne devrais trouver que des
tabulations (09), des retours chariot (0D) et des sauts de ligne (0A).
Tu peux éventuellement accepter aussi la tabulation verticale (0B) et le
saut de page (0C) mais ce n'est peut-être pas obligatoire.

De plus, les fins de lignes seront toujours les mêmes, soit 0D 0A, soit
0D seul (sur Mac), soit 0A seul (sur Unix), mais tu ne dois pas avoir
deux représentations différentes à plusieurs endroits du même fichier.

Après cela, tu peux affiner pour reconnaître le jeu de caractères
employé (et même parfois la langue). Mozilla & Co, par exemple, offrent
de deviner le charset si la page web ne l'indique pas.

(¹) ASCII, ISO-8859-* et UTF-8 en font partie, mais pas UTF-16 ni EBCDIC.

Apres est il possible de déterminer le type de binaire ? (Image, exe
Windows ou linux, elf...)


Oui, puisque la commande file le fait. Voici par exemple une liste de
signatures trouvée via Google :
http://www.garykessler.net/library/file_sigs.html

Cordialement,
--
Olivier Miakinen

Avatar
filh
Thief13 wrote:

Bonjour à tous !

Voilà, je suis confronté à un gros problème : il faut que je contrôle le
type de fichier envoyé par un formulaire, pour vérifier que la personne
n'envoie que des fichiers autorisé.

Seulement, je me suis rendu compte après quelques tests que le contrôle
par mime-type ou par extension est largement insuffisant, car il suffit
de changer l'extension pour trafiquer ces informations.

Premièrement, est il possible de vérifier qu'un fichier est un binaire,
(après quelques test, il m'a semblé que le jpg, le png et le gif sont
binaire) ou du texte ?

Apres est il possible de déterminer le type de binaire ? (Image, exe
Windows ou linux, elf...)

Merci d'avance pour votre aide.


http://pecl.php.net/package/Fileinfo

FiLH

--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org

Avatar
Olivier Miakinen

Voilà, je suis confronté à un gros problème : il faut que je contrôle le
type de fichier envoyé par un formulaire, pour vérifier que la personne
n'envoie que des fichiers autorisé.

[...]


http://pecl.php.net/package/Fileinfo


Voilà une réponse bien plus directe et efficace que la mienne ! Excellent.


Avatar
Thief13
Merci bien,

Cepandant, je ne connais pas tres bien la licence PHP...
Est-ce une licence virale, comme la GPL ? Est-il possible d'intégrer du
code en licence PHP dans une appli proprio ? Je n'arrive pas à trouver
d'infos claire en français la dessus...

Autre petit détail, est il possible d'utiliser cette extention sur un
hebergement mutualisé ?
Avatar
Thief13
Haaa, merci beaucoup, ta réponse m'a vraiment beaucoup aidé, grace à
elle, j'ai commencé à créer un script de test qui marche super bien :

$fichier = fopen($_FILES["nom_du_fichier"]['tmp_name'], "r");

if ($_FILES["nom_du_fichier"]['type'] == 'image/gif') {

$entete = bin2hex(fread($fichier, 6));

echo "entete gif : ";
echo $entete;

if ($entete == "474946383761" || $entete == "474946383961") {
echo " - Entete conforme GIF";
} else {
echo " - erreur, ceci n'est pas un fichier gif";
}

}


Je n'ais plus qu'à l'adapter aux autres formats, et à l'intégrer dans
mon appli une fois finit.

Merci encore !

Avatar
filh
Olivier Miakinen <om+ wrote:


Voilà, je suis confronté à un gros problème : il faut que je contrôle le
type de fichier envoyé par un formulaire, pour vérifier que la personne
n'envoie que des fichiers autorisé.

[...]


http://pecl.php.net/package/Fileinfo


Voilà une réponse bien plus directe et efficace que la mienne ! Excellent.


À noter que c'est pas si simple après, car on a besoin de file, et le
développeur de file étant sous bsd a commis l'idiotie d'utiliser un
bsdisme à un endroit, et donc pour les non bsd et la dernière version il
faut patcher un peu :(

Mais bon sur un nunux on doit avoir déjà file d'installé.

FiLH

--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org



Avatar
filh
Thief13 wrote:

Merci bien,

Cepandant, je ne connais pas tres bien la licence PHP...
Est-ce une licence virale, comme la GPL ? Est-il possible d'intégrer du
code en licence PHP dans une appli proprio ? Je n'arrive pas à trouver
d'infos claire en français la dessus...



Heu... tu peux utiliser ça visiblement dans un php.

Autre petit détail, est il possible d'utiliser cette extention sur un
hebergement mutualisé ?


Ah ça faut voir avec ton hébergeur... c'est lui qui doit l'installer

FiLH

--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org

Avatar
Olivier Miakinen
Le 03/06/2007 10:03, Thief13 répondait à quelqu'un :

Haaa, merci beaucoup, ta réponse m'a vraiment beaucoup aidé [...]


Je ne sais pas bien si c'est la réponse de FiLH ou la mienne qui t'a
aidé, mais je suis ravi que tu aies trouvé ce qui te convient.

Avatar
Thief13

Je ne sais pas bien si c'est la réponse de FiLH ou la mienne qui t'a
aidé, mais je suis ravi que tu aies trouvé ce qui te convient.


La tienne. la proposition de FiLH était sympa et bonne à retenir, mais
je ne peut pas utiliser des composant que l'on doit installer en plus,
je tourne en mutualisé... Je me suis servis de tes conseil et des liens
que tu as fourni pour faire mon petit script ^^

Avatar
John GALLET
Bonjour,

Seulement, je me suis rendu compte après quelques tests que le contrôle
par mime-type ou par extension est largement insuffisant, car il suffit
de changer l'extension pour trafiquer ces informations.


"Toutafé" (tm).

Premièrement, est il possible de vérifier qu'un fichier est un binaire,
(après quelques test, il m'a semblé que le jpg, le png et le gif sont
binaire) ou du texte ?


Si c'est pour refuser tous les binaires, ça peut avoir un intérêt. Sinon
je ne vois pas trop. C'est le contenu du fichier qui est dangereux,
pas son type. Et même un fichier "texte" selon son charset d'encodage
pourrait être vu "binaire" dans certains cas (nécessiter un traitement
type binaire pour ne pas être corrompu au passage).

Apres est il possible de déterminer le type de binaire ? (Image, exe
Windows ou linux, elf...)


Certains utilitaires unix permettent de regarder les headers du fichier
pour voir ce qu'il déclare être. Mais ça n'empêche pas de prendre un
éditeur hexadécimal et de mettre, au hasard, du code PHP en bout de
fichier. Ou du code VBScript. Un hébergeur dont je tairai le nom avait
pour habitude d'exécuter n'importe quoi avec "php" dans le nom. Genre
"toto_php_tata.jpg" était exécuté par php. Et si lecteur windows Media
Player reçoit une vidéo avec du code JS ou autre, il est possible qu'il
l'exécute.

Pour les images, on peut coupler plusieurs tests avec des librairies
graphiques style GD-Lib, et forcer la réécriture du fichier par exemple
en modifiant l'exif. Si l'ouverture du fichier et réécriture
fonctionnent, il y a forte probabilité que ce soit bien une image ne
contenant pas d'autres saloperies.

Pour les autres types de fichiers, il faut gérer ça au cas par cas.

Dans tous les cas, ne pas oublier, surtout, d'en interdire l'appel
direct ultérieur par http, c'est le plus important si on n'a pas
confiance dans les utilisateurs (i.e. la gestion d'un blog est plus
risquée que l'interface d'administration d'un client qui gère toute son
activité avec et n'a aucun intérêt à casser son propre système).

JG