#14918

Note : rappel PHP

NEVER TRUST USER INPUT

C’est valable pour les formulaires POST et GET mais aussi plein d’autres choses :
– cookies
– variables de sessions
– noms de fichiers uploadés ($_FILES)
– les types de fichiers (dont MIME)
– variables dans le php.ini
– …

Sans oublier des vérifications spéciales dans certains cas : si la chaîne « . » (un simple point) est grammaticalement valable pour un pseudo ou un mot de passe, ça devient très dangereux quand il s’agit d’un nom de fichier (« . » c’est un raccourcis pour dire « dossier courant », comme « .. » signifie « dossier parent »).

Si en PHP vous avez un script pour renommer un fichier, un nouveau nom « . » sera valide pour le htmlspecialchars(). Mais au moment où le serveur transmet la requête « renomme le fichier abc.jpg en "." » au système d’exploitation ou au système de fichier, dans le meilleur des cas ça génère une erreur, dans le pire ça écrase le dossier courant et son contenu (le "." c’est le dossier courant et là on renomme un fichier par dessus).

Et pour supprimer un fichier, pareil : http://lehollandaisvolant.net/tuto/php/#supprimer-un-fichier


Enfin, l’utilisateur est toujours très con quand il s’agit d’utiliser un logiciel. Il fera toujours n’importe quoi, et encore plus si ça permet de faire planter l’ordinateur.
C’est très fatiguant de devoir penser à tout, comme ici avec la gestion du CSV http://sebsauvage.net/wiki/doku.php?id=csv . Heureusement, ici certains l’ont fait.

Si ce n’est pas le cas dans ce que vous faites, je conseille de ne pas avoir peur de faire une application limitée mais qui fonctionne plutôt qu’un truc illimité qui plante, même dans seulement 0,01% des cas : la loi de Murphy ne plante pas elle.

Par exemple, pour gérer les extensions de fichiers, je préfère dresser une liste avec les 20 extensions les plus communes (png, doc, jpg, mp3, apk…) et mettre tout le reste dans « autres », plutôt que d’essayer de détecter l’extension des fichiers (par régex ou autres).

Tôt ou tard, il y aura un urluberlu avec un nom de fichier de 500 caractères, ou avec une extension de 500 caractères, ou sans extensions, ou une extension en unicode, ou une extension en unicode-privé sur une fonte que vous n’avez pas, ou avec des caractères d’échappement.

Afficher 500 caractères ce n’est pas un soucis en soit, mais ça déforme l’affichage si l’absence d’espaces génère un non-retour à la ligne…

Ah et, si votre fichier est envoyé depuis GNU/Linux, il peut contenir des espaces et des caractères unicodes ou de la ponctuation. Windows n’aime pas ça et parfois il refusera d’enregistrer ce fichier au nom bizarre (ça dépend du système de fichier : FAT32 gère ça très mal en tout cas).

Bref, faut avoir une vision d’ensemble des chose : uploader un fichier, c’est pas juste une requête "files", c’est aussi penser à celui qui maintient caps-lock allumé quand il renomme ses photos avec des noms à rallonge sous Windows sur un clavier russe.
http://lehollandaisvolant.net/?mode=links&id=20160331195130