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.
