Apache et les extensions de fichier pour le charset
Grâce au mod_mime d’Apache 2 on peut envoyer un charset pour un document en utilisant des extensions. La liste des extensions utilisables peut se trouver dans le fichier de configuration du mod_mime (/etc/apache2/mods-available/mime.conf).
S’il n’y a aucune utilité pour les fichiers interprétés (comme PHP) puisqu’on peut envoyer ses propres headers, cela peut s’avérer utile pour des fichiers non interprétés, comme de simples fichiers textes.
Supposons le fichier test.txt en UTF-8. Si on l’affiche, le serveur web Apache envoie par défaut le charset ISO-8859-1, ce qui pose problème avec les caractères accentués. Si on le renomme en test.txt.utf8 et qu’on demande au serveur web test.txt alors il envoie le fichier avec le charset UTF-8. Pratique non ? En bonus, on a même droit à un Content-location pour indiquer que le fichier réel est test.txt.utf8.
Poussons l’idée plus loin comme l’a fait edcba sur #nibbles, que se passe-t-il avec un fichier .php ?
Prenons un fichier test.php.utf8, si on demande test.php Apache non seulement renvoie la page test.php.utf8 mais interprétée par PHP ! Certes, le charset n’est pas défini à UTF-8 (PHP doit certainement prendre la main après Apache et mettre par défaut ISO-8859-1), mais le fait que le fichier soit quand même interprété est assez intéressant comme l’a remarqué Gu1ll4um3r0m41n. En effet, sur des scripts d’envoi de fichiers où une vérification est faite seulement sur l’extension .php, ça peut permettre d’envoyer un fichier qui pourrait être interprété…
Pas de bêtises ! ;)
Je savais pas, et c’est très intéressant.
T’as découvert ça seul ou en recherchant des trucs sur Google ?
Merci, en tout cas.
Geo
De rien !
Tout seul par hasard. J’écrivais un fichier texte UTF-8 à publier, j’ai commencé à mettre des accents et comme mon DefaultCharset était à ISO-8859 ça n’a pas super bien rendu. Je me souvenais vaguement avoir lu dans la doc qu’on pouvait forcer le charset grâce aux extensions, un peu comme on peut forcer le type mime. Du coup j’ai creusé dans cette direction, vu que ça marchait, et testé à tout hasard avec PHP. Tout ça en direct live sur IRC avec les deux compères sus-cités :)