# wp_check_filetype avant un upload : vérifier l’extension d’un fichier

> Le type MIME déclaré par le navigateur au moment d'un dépôt de fichier ne garantit rien. Une vérification côté serveur reste indispensable avant tout traitement.

- Auteur : WordPress Développement
- Publié le : 2024-06-30
- Mis à jour le : 2024-06-30
- Catégorie : Astuces
- URL : https://www.wpmoderne.fr/tips/wp-check-filetype-verifier-extension-fichier/

## L’essentiel

- Le type MIME transmis par le navigateur peut être falsifié sans effort
- wp_check_filetype() détermine le type réel à partir de l'extension et d'une liste autorisée
- La fonction ne lit pas le contenu binaire du fichier, une limite à connaître

`Content-Type: image/jpeg` dans les en-têtes d'une requête d'upload ne garantit strictement rien sur la nature réelle du fichier transmis. Cette valeur est déclarée par le client — le navigateur, ou un script qui simule une requête — et peut être modifiée sans la moindre difficulté par quiconque contrôle la requête envoyée au serveur.

Faire confiance à cette information pour décider si un fichier déposé par un visiteur est acceptable revient à laisser l'utilisateur décider lui-même des règles de sécurité de son propre upload, ce qui n'a évidemment aucun sens du point de vue de la protection du site.

## Ce que fait wp_check_filetype()

WordPress propose une fonction dédiée à cette vérification côté serveur : `wp_check_filetype()`. Elle prend le nom du fichier en argument et détermine, à partir de son extension, le type MIME correspondant, en le comparant à une liste de types autorisés configurée sur le site :

```
$verification = wp_check_filetype( 'photo-produit.jpg' );

print_r( $verification );
// array(
//     [ext]  => jpg
//     [type] => image/jpeg
// )

$verification = wp_check_filetype( 'script-suspect.php.jpg' );
// array(
//     [ext]  => jpg
//     [type] => image/jpeg
// )
```

Le second exemple illustre une limite importante de la fonction : elle se fie uniquement à l'extension finale du nom de fichier, pas à son contenu binaire réel. Un fichier nommé de façon trompeuse mais se terminant par une extension autorisée passe la vérification, même si son contenu effectif n'a rien à voir avec une image.

## Utiliser la fonction avant tout traitement d'upload

> L'essentiel à retenir : Le type MIME transmis par le navigateur peut être falsifié sans effort ; wp_check_filetype() détermine le type réel à partir de l'extension et d'une liste autorisée ; La fonction ne lit pas le contenu binaire du fichier, une limite à connaître

```
function traiter_depot_document( $fichier ) {
    $verification = wp_check_filetype( $fichier['name'] );

    if ( ! $verification['type'] ) {
        return new WP_Error(
            'extension_non_autorisee',
            "Le type de fichier déposé n'est pas autorisé sur ce site."
        );
    }

    // Poursuivre le traitement uniquement si l'extension est reconnue.
    return wp_handle_upload( $fichier, array( 'test_form' => false ) );
}
```

Si l'extension du fichier ne figure pas dans la liste des types autorisés par WordPress, `type` vaut une chaîne vide dans le tableau renvoyé, ce qui permet de rejeter l'upload avant d'aller plus loin dans le traitement.

## Ajuster la liste des types autorisés

La liste des extensions et types MIME reconnus par WordPress est filtrable via `upload_mimes`, ce qui permet d'élargir ou de restreindre les types acceptés selon les besoins du projet :

```
add_filter( 'upload_mimes', function ( $mimes ) {
    unset( $mimes['exe'] );
    $mimes['webp'] = 'image/webp';

    return $mimes;
} );
```

Cette liste sert de référence à `wp_check_filetype()` pour déterminer si une extension donnée est effectivement autorisée sur le site, en plus d'être utilisée par la médiathèque elle-même lors d'un dépôt classique via l'interface d'administration.

## Ce que la fonction ne remplace pas

- Elle ne vérifie jamais le contenu binaire réel du fichier : un fichier malveillant renommé avec une extension autorisée passe la vérification sans problème.
- Elle ne protège pas contre un fichier dont le contenu contredit son extension déclarée, un cas que seule une analyse du contenu binaire peut détecter.
- Pour un contrôle plus poussé, la fonction `wp_check_filetype_and_ext()` va plus loin en tentant de confirmer la cohérence entre l'extension et le contenu réel du fichier, avec cependant ses propres limites selon le type de fichier concerné.

## Un contrôle complémentaire avec wp_check_filetype_and_ext()

```
$verification = wp_check_filetype_and_ext(
    $fichier['tmp_name'],
    $fichier['name']
);

if ( $verification['ext'] !== $verification['proper_filetype'] ?? $verification['ext'] ) {
    // Divergence détectée entre extension déclarée et contenu analysé.
}
```

Cette fonction plus poussée analyse notamment les fichiers image en tentant de lire leurs premiers octets pour confirmer leur nature réelle, ce qui offre une garantie supplémentaire, sans pour autant constituer un contrôle de sécurité exhaustif contre tout type de fichier malveillant déguisé.

## Une vérification, pas une garantie absolue

Sur un formulaire qui accepte des dépôts de fichiers de visiteurs non authentifiés, cette vérification d'extension reste une première ligne de défense nécessaire, mais elle doit s'accompagner d'autres précautions : restriction des dossiers d'upload à l'exécution de scripts serveur, limitation de la taille des fichiers acceptés, et surveillance des types de fichiers réellement déposés en production.

> Sur tout formulaire public acceptant des fichiers, ne jamais se fier au type MIME déclaré par le navigateur reste une règle de base, quelle que soit la technologie utilisée derrière le formulaire.

## En résumé

`wp_check_filetype()` apporte une vérification côté serveur indépendante de ce que le navigateur affirme, mais elle reste limitée à l'extension du nom de fichier. Pour un site qui accepte des dépôts sensibles, la combiner à `wp_check_filetype_and_ext()` et à des restrictions serveur complémentaires reste la seule approche réellement robuste.
