Formation PUB020 : WordPress, 2023 Les nonces dans WordPress

39.2 Utilisation d'un nonce dans un formulaire


Le processus de sécurité mis en place par les nonces dans un formulaire WordPress se déroule en deux temps : la génération du nonce lorsque le formulaire est affiché puis la vérification de la validité du nonce lorsque le formulaire est traité.

Génération du nonce

Lorsqu'une balise <form> est générée, un nonce est également généré à l'aide de la fonction wp_nonce_field(). Cette fonction génère le nonce puis l'ajoute au formulaire dans un champ caché.

La fonction demande quelques paramètres, tous optionnels.

  • Action : il est fortement recommandé de fournir ce paramètre. Il s'agit d'une chaîne qui représente l'action à effectuer. Cette chaîne est utilisée dans l'algorithme de création du nonce, ce qui le rend plus difficile à deviner. Elle sera également utilisée lors de la vérification de la validité du nonce. Dans le cas d'un formulaire de modification, on y ajoutera l'identifiant de l'élément sur lequel on désire travailler (ex : editer_item_3). Par défaut, ce paramètre prend la valeur -1.
  • Nom : il s'agit de l'attribut name à donner au champ caché ainsi créé. Par défaut, ce sera _wpnonce.
  • Referer : le troisième paramètre indique si un second champ caché doit être créé pour stocker l'URL de la page du formulaire. Cette information pourrait être utilisée comme validation supplémentaire lors du traitement du formulaire. Ce paramètre est à true par défaut.
  • Echo : lorsque wp_nonce_field() est utilisée dans un shortcode, le quatrième paramètre est également important : en le mettant à false, il permet d'éviter de faire un echo du champ caché ainsi créé. Il sera seulement utilisé comme valeur de retour. Ce paramètre est à true par défaut. Il a également son utilité dans le tableau de bord : il permet de stocker le nonce dans une variable puis de l'utliser au moment opportun. 

Prenons le cas d'un formulaire affiché dans le tableau de bord. Son affichage sera codé dans la fonction de rappel associée à l'option de menu qui affiche le formulaire.

Le nonce sera généré ainsi :

Fichier functions.php ou son sous-fichier tableau-de-bord-pages.php

$nonce = wp_nonce_field( 'une_action_donne_sur_id_3', 'nomduchampcache', true, false);
 
?>
<form method='post' action='...'>
    <?php echo $nonce; ?>    
    ...
</form>
<?php  

ou

Fichier functions.php ou son sous-fichier tableau-de-bord-pages.php

?>
<form method='post' action='...'>
    <?php wp_nonce_field( 'une_action_donnee_sur_id_3', 'nomduchampcache', true, true); ?>    
    ...
</form>
<?php  

Lorsque la fonction de rappel qui génère ce formulaire sera exécutée, le code suivant sera généré :

HTML

<form method='post' action='...'>
    <input type="hidden" id="nomduchampcache" name="nomduchampcache" value="b902a6edc8" />
    <input type="hidden" name="_wp_http_referer" value="..." />
    ...
</form>

Vérification de la validité du nonce

Lors du traitement du formulaire, une vérification de la validité du nonce est effectuée à l'aide de wp_verify_nonce().

  • Le premier paramètre de wp_verify_nonce() est la valeur du nonce à vérifier. Puisque le nonce a été stocké dans un champ caché, sa valeur peut être récupérée à l'aide de $_POST, au même titre que les autres informations du formulaire.
  • Le second paramètre correspond à l'action, tel que spécifiée lors de la création du nonce.
Fichier de traitement du formulaire (PHP)

// traitement du formulaire
if ( isset( $_POST['soumettre'] ) ) {   // si la page a reçu des données du formulaire  
    if ( isset($_POST['nomduchampcache'] ) && wp_verify_nonce( $_POST['nomduchampcache'], 'une_action_donnee_sur_id_3' ) ) {
        ...   // effectuer l'action prévue par le formulaire
    } else {
        ...    //traitement à effectuer si le nonce n'est pas valide
    }
}

// renvoie le contrôle à la page qui affiche la liste des items dans le tableau de bord
$url = admin_url( "admin.php?page=monprefixe_gestion" );
wp_redirect( $url );

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre