logo noucode

Sécuriser vos formulaires WordPress avec les Nonces

02/09/2026

Écrit par Johanny

PHP

ncode_level

3 vues

Sommaire

La sécurité des formulaires est un aspect critique du développement WordPress. Pour empêcher les attaques de type Cross-Site Request Forgery (CSRF), WordPress propose un système de jetons de sécurité appelés "Nonces".

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...
Attention : Ne vérifiez jamais le nonce après avoir déjà modifié des données en base de données. La vérification doit être la toute première étape de votre script de traitement.

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.

PratiqueStatutRaison
Vérifier le nonce seulLe 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.

Cet article t'a plu ?

Ajoute le premier commentaire
0 Commentaires
Le plus récent
Le plus ancien Le plus populaire

Rechercher sur le site: