Détection du type de MIME

From mediawiki.org
This page is a translated version of the page Manual:MIME type detection and the translation is 100% complete.

MediaWiki essaie de détecter le type de MIME des fichers que vous téléversez, et rejette les fichiers dont l'extension ne correspond pas au type de MIME (« Le fichier est corrompu ou possède une extension incorrecte »). Si cette erreur apparait pour des fichiers valides, essayez d'utiliser une commande externe de détection du type de MIME (voir ci-dessous).

Avant que la méthode configurée pour le type de détection du MIME ne soit appelée, certains contrôles implémentés en dur sont effectués. Utilisez la journalisation des traces de debogage pour voir si ces contrôles ont généré des faux positifs. (Par exemple, MediaWiki 1.15.3 peut détecter à tord les fichiers .doc de MS Word 2007 comme des fichiers ZIP).

Pour configurer le type de fichier que MediaWiki va accepter lors des téléversements, utilisez $wgFileExtensions .

Détection du MIME

Quand il est installé, MediaWiki utilise le module FileInfo de PHP ou l'ancien module MimeMagic. Si vous obtenez une erreur du type mime_magic ne peut être initialisé, le fichier magique n'est pas disponible, ce module n'est pas configuré correctement — voir la documentation PHP pour corriger cela, ou utilisez à la place une commande externe de détection de MIME (voir ci-dessous).

Vous pouvez aussi configurer une commande externe de détection du type de MIME en intialisant l'option $wgMimeDetectorCommand . L'initialisation la plus commune est :

$wgMimeDetectorCommand = "file -bi"; # sous Linux
$wgMimeDetectorCommand = "file -bI"; # sous macOS

Ceci utilise l'utilitaire GNU file pour déterminer le type de fichier, utilisable directement sous Linux. Notez que l'utilitaire file fourni avec d'autres systèmes de type Unix peut ne pas reconnaître l'option -i, et donc ne fonctionnera pas. L'utilitaire GNU file est également disponible pour Mac OS-X, et pour Windows via Cygwin.

S'il n'y a pas de module MIME et qu'aucune commande externe de détection du type n'est configurée, MediaWiki utilise le module PHP GD pour détecter le type de MIME. Notez bien, que cela ne fonctionne qu'avec certains types bien connus d'images (voir [1]), les autres fichiers seront acceptés sans contrôle supplémentaire !

Vous pouvez également supprimer complètement le contrôle du type de MIME en intialisant $wgVerifyMimeType = false; — néanmoins notez que cela nuit à la sécurité : on peut alors téléverser des fichers arbitraires ayant une extension inoffensive, mais qui pourront éventuellement ensuite être exécutés ou interprétés d'une manière offensive sur l'ordinateur du client, ou sur le serveur web. En cours : comment ceci est-il relié à $wgCheckFileExtensions  ?

Améliorer la détection du type de MIME

En cas de détection erronée de types plus spécifiques tels que chemical/x-jcamp-dx comme text/plain, MimeMagicImproveFromExtension ou MimeMagicGuessFromContent peuvent être utiles :

/**
 * Exemple pour ajouter une extension de fichier supplémentaire basée sur la détection de MIME via LocalSettings.php
 * @param MimeAnalyzer $mimeAnalyzer
 * @param str $ext: File extension.
 * @param str &$mime: MIME type (out).
 */
$wgHooks['MimeMagicImproveFromExtension'][] = static function ( $mimeAnalyzer, $ext, &$mime ) {
    if ( in_array( $ext, ['dx', 'jdx', 'jcm'] ) ) {
        $mime = 'chemical/x-jcamp-dx';
    }
};
/**
 * Exemple pour ajouter la détection de MIME basée sur le contenu de fichiers supplémentaires via LocalSettings.php
 * @param MimeAnalyzer $mimeAnalyzer
 * @param str &$head: 1024 bytes of the file in a string (in - Do not alter!).
 * @param str &$tail: More or equal than last 65558 bytes of the file in a string (in - Do not alter!).
 * @param str $file: File path.
 * @param str &$mime: MIME type (out).
 */
$wgHooks['MimeMagicGuessFromContent'][] = static function ( $mimeAnalyzer, &$head, &$tail, $file, &$mime ) {
    if ( str_contains( $head, '##JCAMP' ) ) {
        $mime = 'chemical/x-jcamp-dx';
    }
};

Validation du type de MIME

MediaWiki range les types de MIME et les types de médias par défaut dans MimeMap.php.

A partir de MediaWiki 1.24 et pour prendre en charge les types de MIME supplémentaires pour les téléversements sur votre wiki, vous pouvez utiliser l'accroche MimeMagicInit .

/**
 * Exemple pour ajouter des types de MIME supplémentaires via LocalSettings.php
 * @param MimeAnalyzer $mime
 */
$wgHooks['MimeMagicInit'][] = static function ( $mime ) {
    $mime->addExtraTypes( 'text/plain md' );
    $mime->addExtraInfo( 'text/example [OFFICE]' );
};

Types supplémentaires

Le type de MIME regroupe les extensions des fichiers appartenant à ce type de MIME. Pour reconnaitre les fichiers d'extension .md comme étant du type text/plain pour le Markdown on écrira :

$mime->addExtraTypes( 'text/plain md' );

Pensez aussi à ajouter l'extension à $wgFileExtensions pour lui permettre d'être utilisée avec les nouveaux téléversements dans votre wiki.

Vous pouvez également fournir plusieurs extensions de fichiers, par exemple ce qui suit est ce que MediaWiki aurait fait en interne avec JPEG :

$mime->addExtraTypes( 'image/jpeg jpg jpeg jpe' );

Notez que le type MIME de certains fichiers peut être détecté trop légèrement - un format basé sur XML peut s'afficher en tant que text/xml et un format basé sur ZIP, en tant que application/zip. Par conséquent les extensions de fichiers pour de tels formats doivent être associées avec le type MIME le plus général par exemple :

text/xml xml xsl xslt rss rdf
application/zip zip jar xpi
application/msword doc xls ppt

Informations supplémentaires

Les données mime info servent à résoudre les alias des types de MIME, et de leur assigner un type de média. Elles contiennent une ligne par type de MIME; le premier élément de chaque ligne est le nom canonique du type de MIME (utilisé en interne), le dernier élément est du type [XXX] et il définit le type de média correspondant au type de MIME.

Pour assigner text/example au type de média OFFICE :

$mime->addExtraInfo( 'text/example [OFFICE]' );

Quelques exemples :

image/png image/x-png	[BITMAP]
image/svg image/svg+xml application/svg+xml application/svg	[DRAWING]
audio/mp3 audio/mpeg3 audio/mpeg	[AUDIO]

Notez que pour les fichers OGG, le type de média est déterminé par programmation : AUDIO pour vorbis, VIDEO pour theora, et MULTIMEDIA dans les autres cas.

Le type de média est spécifique à MediaWiki, et il détermine le type de média contenu dans le fichier, par opposition au format dans lequel le fichier est présenté. Cette information est rangée dans la table image en même temps que le type de MIME. Actuellement il n'est pas beaucoup utilisé mais il peut le devenir à l'avenir pour déterminer la manière de présenter un fichier à l'utilisateur. Les types suivants sont définis :

UNKNOWN format inconnu
BITMAP image bitmap ou le source d'une image (telle que psd, etc...). Non redimensionnable.
DRAWING dessin vectoriel (SVG, WMF, PS, ...) ou le source d'une image (oo-draw, etc). Redimensionnable.
AUDIO fichier audio simple (ogg, mp3, wav, midi, ou autre)
VIDEO fichier vidéo simple (ogg, mpg, etc...; n'incluez pas ici de formats pouvant contenir des sections exécutables ou des scripts !)
MULTIMEDIA multimédia avec scripts (flash, formats avancés de contenueurs vidéo, etc...)
OFFICE documents Office, feuilles de calculs (formats Office pouvant éventuellement contenir des applets, des scripts, etc...)
TEXT texte brut (éventuellement un source de programme ou script)
EXECUTABLE exécutable binaire
ARCHIVE fichier d'archive (zip, tar, etc...)

Fichiers interdits

En plus de l'option $wgFileExtensions , les paramètres suivants peuvent faire rejeter les fichiers (même si $wgStrictFileExtensions = false; est activé) :

En plus, MediaWiki rejette tous les fichiers qui ressemblent à des scripts et qui pourraient être exécutés par erreur soit sur le serveur web ou le navigateur de l'utilisateur. Notamment, tout ce qui ressemble à l'un des formats suivants sera rejeté quelque soit le type de MIME détecté ou l'extension du fichier : HTML, JavaScript, PHP, ou scripts du shell. Notez que la détection de HTML et de JavaScript est plutôt grossière, et peut détecter des faux positifs — ceci est dû au fait que Microsoft Internet Explorer est connu pour interpréter les fichiers qui ressemblent à du HTML, quelque soit leur extension ou le type de MIME donné par le serveur web, ce qui pourrait conduire à avoir un site vulnérable aux attaques des scripts inter-sites (cross-site scripting). Si vous souhaitez même autoriser réellement de tels fichiers dangereux, vous pouvez modifier la fonction detectScript du fichier UploadBase.php pour qu'elle retourne toujours false.

Contrôle des virus

En attente. Pour l'instant, voir $wgAntivirus et $wgAntivirusSetup

Types de MIME dans les téléchargements

Notez que le type de MIME utilisé lorsque le fichier actuel est envoyé vers le navigateur de l'utilisateur n'est pas déterminé par la détection du MIME dans MediaWiki : les fichiers ne sont pas envoyés par MediaWiki mais directement à partir du serveur web. Ainsi, le serveur web doit être configuré pour utiliser le type de MIME correct pour chaque extension de fichier - par exemple si vous avez des difficultés pour visualiser les fichiers SVG dans votre navigateur, vérifiez que le serveur est configuré pour les délivrer avec le type image/svg+xml. (Pour Apache, veuillez lire mod_mime).

Voir aussi

Anciennes discussions sur meta :