Comprendre les Nonces dans WordPress
Le terme Nonce est la contraction de « number used once » (nombre utilisé une seule fois). Bien que dans WordPress, ils ne soient pas strictement uniques à chaque utilisation mais plutôt valides pour une fenêtre de temps donnée, leur objectif reste le même : s’assurer que la requête provient bien de l’utilisateur attendu et non d’un tiers malveillant.
Sans nonce, un site est vulnérable aux attaques CSRF (Cross-Site Request Forgery). Dans ce scénario, un attaquant peut inciter un administrateur connecté à cliquer sur un lien ou soumettre un formulaire caché qui déclenche une action non désirée (comme la suppression d’un article ou le changement d’un mot de passe) sans que l’administrateur n’en ait conscience.
Comment ajouter un nonce à un formulaire
Pour sécuriser un formulaire, la première étape consiste à insérer un champ caché contenant le jeton de sécurité. WordPress fournit la fonction wp_nonce_field() pour automatiser cette tâche.
Cette fonction génère un champ <input type="hidden"> avec une valeur unique et un nom de champ spécifique.
<form action="process.php" method="post">
<!-- Génère le champ nonce et le champ de vérification -->
<?php wp_nonce_field( 'ma_sauvegarde_action', 'ma_nonce_field' ); ?>
<input type="text" name="user_name" value="Jean Dupont" />
<input type="submit" value="Enregistrer" />
</form>Ici, ma_sauvegarde_action est l’action liée au nonce (un identifiant unique pour cette opération) et ma_nonce_field est le nom du paramètre qui sera envoyé dans la requête $_POST.
Vérifier la validité du nonce lors du traitement
L’ajout du champ dans le formulaire est inutile si vous ne vérifiez pas sa validité côté serveur lors de la réception des données. Pour cela, on utilise généralement la fonction wp_verify_nonce() ou check_admin_referer().
La fonction wp_verify_nonce() retourne 1 si le nonce est valide et false ou 0 s’il est incorrect ou expiré.
$nonce = $_POST['ma_nonce_field'];
$action = 'ma_sauvegarde_action';
if ( ! wp_verify_nonce( $nonce, $action ) ) {
// Le nonce est invalide, on arrête tout
wp_die( 'Erreur de sécurité : le jeton de vérification est invalide.' );
}
// Si on arrive ici, la requête est authentifiée
// Traitement des données...Exemple complet de mise en œuvre
Voici un exemple concret intégrant la création d’un formulaire simple et son traitement sécurisé au sein d’un même fichier ou d’une fonction de plugin.
<?php
// 1. Traitement des données
if ( isset( $_POST['submit_update'] ) ) {
// Vérification du nonce
if ( ! isset( $_POST['my_custom_nonce'] ) || ! wp_verify_nonce( $_POST['my_custom_nonce'], 'update_user_meta' ) ) {
wp_die( 'Accès non autorisé ou session expirée.' );
}
// Vérification des droits de l'utilisateur (indispensable en complément)
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'Vous n\'avez pas les permissions nécessaires.' );
}
// Mise à jour sécurisée
update_option( 'my_custom_setting', sanitize_text_field( $_POST['setting_value'] ) );
echo '<p>Réglages mis à jour avec succès !</p>';
}
// 2. Affichage du formulaire
?>
<form method="post">
<label for="setting_value">Valeur du réglage :</label>
<input type="text" id="setting_value" name="setting_value" value="
<input type="submit" name="submit_update" value="Sauvegarder" />
</form>Utilisation des nonces avec AJAX
Pour les requêtes AJAX, vous ne pouvez pas utiliser wp_nonce_field() car il n’y a pas de formulaire HTML classique. Vous devez générer le nonce avec wp_create_nonce() et le passer via JavaScript.
La méthode recommandée consiste à utiliser wp_localize_script() pour envoyer le nonce du serveur vers votre fichier JS :
wp_localize_script( 'mon-script-js', 'wp_ajax_obj', array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'my_ajax_nonce' ),
) );Ensuite, dans votre handler PHP pour l’action AJAX, vous vérifiez le nonce ainsi :
add_action( 'wp_ajax_mon_action', 'mon_handler_ajax' );
function mon_handler_ajax() {
check_ajax_referer( 'my_ajax_nonce', 'security' );
// Traitement...
wp_send_json_success( 'Données reçues !' );
}Erreurs courantes et bonnes pratiques
Pour garantir une sécurité maximale, gardez à l’esprit les points suivants :
Utiliser des actions uniques✅Évitez d’utiliser le même nom d’action pour tous vos formulaires.Vérifier le nonce en début de script✅Empêche l’exécution de code coûteux ou dangereux si le jeton est invalide.Confondre Nonce et Token CSRF standard⚠️Les nonces WordPress ont une durée de vie limitée (24h) et sont liés à l’ID utilisateur.
| Pratique | Statut | Raison |
|---|---|---|
| Vérifier le nonce seul | ❌ | Le nonce prouve l’origine, pas l’identité. Utilisez current_user_can() en complément. |
Conclusion
L’implémentation des nonces est une étape fondamentale pour tout développeur WordPress souhaitant créer des fonctionnalités robustes. En combinant wp_nonce_field() pour la génération et wp_verify_nonce() pour la validation, vous fermez la porte aux attaques CSRF. N’oubliez jamais que le nonce sécurise le transport de la requête, tandis que les capacités (capabilities) sécurisent l’accès aux fonctionnalités.

