Masquer la version de WordPress

Masquer la version de WordPress (utile, mais pas suffisant pour la sécurité)

Objectif: enlever les indices comme le meta generator, le “?ver=” sur CSS/JS, le readme, et l’info dans l’API. À combiner avec mises à jour, 2FA et WAF.


1) Retirer la balise generator de l’entête et des flux

Ajoutez ceci dans functions.php de votre thème enfant ou en MU‑plugin:

// Supprimer la version dans <meta name="generator"> et les feeds
add_action('init', function () {
    remove_action('wp_head', 'wp_generator');
    add_filter('the_generator', '__return_empty_string'); // RSS, Atom, etc.
});

2) Masquer “?ver=…” dans les URLs des scripts et styles

Note: retirer “?ver” peut gêner le cache-busting lors des mises à jour. Option A le supprime; option B le remplace par un hash de fichier.

  • Option A — supprimer complètement:
function rm_wp_ver_query($src) {
    return remove_query_arg('ver', $src);
}
add_filter('style_loader_src', 'rm_wp_ver_query', 10, 1);
add_filter('script_loader_src', 'rm_wp_ver_query', 10, 1);
  • Option B — remplacer par la date de modification du fichier (recommandé):
function asset_ver_by_mtime($src) {
    $home = home_url('/');
    if (strpos($src, $home) !== 0) return $src; // laisser CDN externes
    $path = ABSPATH . str_replace($home, '', $src);
    if (file_exists($path)) {
        $src = remove_query_arg('ver', $src);
        $src = add_query_arg('v', filemtime($path), $src); // pas lié à WP
    } else {
        $src = remove_query_arg('ver', $src);
    }
    return $src;
}
add_filter('style_loader_src', 'asset_ver_by_mtime', 10, 1);
add_filter('script_loader_src', 'asset_ver_by_mtime', 10, 1);

3) Enlever l’info de version dans l’API REST (index /wp-json)

add_filter('rest_index', function ($response) {
    if (is_object($response) && method_exists($response, 'get_data')) {
        $data = $response->get_data();
        unset($data['generator']);            // supprime le lien WordPress ?v=...
        $response->set_data($data);
    }
    return $response;
});

4) Bloquer l’accès à readme.html et license.txt

  • Apache (.htaccess à la racine WP):
<FilesMatch "^(readme|license)\.(html|txt)$">
  Require all denied
</FilesMatch>
  • Nginx (bloc server):
location ~* /(readme|license)\.(html|txt)$ { deny all; }

5) Cacher la version PHP/serveur (headers)

  • PHP: dans php.ini ou user.ini
expose_php = Off
  • Nginx: remplacez ou videz “Server” header (via more_set_headers si disponible).
  • Apache: ServerTokens Prod; ServerSignature Off.

6) Plugins qui le font pour vous

  • iThemes Security, WP Hide & Security Enhancer, WP Hardening: proposent d’unifier ces réglages. Testez la compatibilité avec votre thème/constructeur.

Bonnes pratiques et limites

  • Masquer ≠ sécuriser. La vraie protection: mises à jour rapides, 2FA, limitation de taux sur /wp-login.php et /xmlrpc.php, WAF/CDN, rôles minimaux, backups.
  • Après modifications, videz tous les caches (plugin, objet/Redis, CDN) et vérifiez:
    • Page source: plus de meta generator.
    • /wp-json: pas de champ “generator”.
    • Assets: plus de “?ver=6.x.y” (ou remplacé par “?v=…”).
    • readme.html retourne 403.