Le navigateur envoie automatiquement les cookies de session d’un site à chaque requête vers ce site, où qu’elle soit déclenchée. Un site malveillant peut exploiter ce comportement en glissant un formulaire ou une image piégée qui envoie une requête vers votre site pendant que vous êtes connecté ailleurs dans le même navigateur : le serveur, voyant un cookie valide, exécute l’action sans se douter qu’elle n’a jamais été voulue.
Protection dans WordPress
WordPress se défend contre ce risque grâce aux nonces : chaque formulaire ou lien d’action sensible embarque un jeton unique et daté, généré par wp_nonce_field() ou wp_create_nonce(), et vérifié côté serveur avec check_admin_referer() ou wp_verify_nonce() avant d’exécuter la moindre modification.
Exemple
// dans le formulaire
wp_nonce_field('wpm_suppression_article', 'wpm_nonce');
// au traitement
if (!check_admin_referer('wpm_suppression_article', 'wpm_nonce')) {
wp_die(__('Requête invalide.', 'wpm'));
}
À ne pas confondre avec
Le CSRF force l’utilisateur à exécuter une action à son insu, alors que le XSS (« cross-site scripting ») injecte du code qui s’exécute directement dans son navigateur : les deux se combinent parfois, un XSS pouvant servir à générer automatiquement une requête CSRF. Une action déclenchée par une simple requête GET sans nonce, y compris un lien de suppression cliquable, reste une des erreurs les plus fréquentes qui ouvre la porte à ce type d’attaque, car un lien peut être chargé automatiquement par un navigateur sans le moindre clic volontaire de la victime.