Formation PUB020 : WordPress, 2023 Les nonces dans WordPress

39.3 Utilisation d'un nonce pour protéger un lien menant à une action


Prenons le cas où, dans le tableau de bord, l'administrateur a accès à une liste d'éléments. Pour chacun, un lien mène vers la page de suppression de l'élément.

Qu'adviendrait-il si un utilisateur malveillant mettait la main sur cet URL mais changeait l'identifiant de l'élément à supprimer?

S'il ne détient pas les droits requis et que la page de suppression vérifie ces droits avant de procéder, il ne pourra rien faire. Par contre, s'il utilisait une ruse pour faire parvenir ce lien forgé à une personne ayant les droits requis tout en lui faisant croire qu'il s'agit d'autre chose, un clic pourrait être dangereux.

C'est ici que les nonces entrent en jeu.

D'abord, le nonce ne pourra être utilisé par une personne autre que celle qui était authentifiée lorsque le nonce a été généré.

De plus, lors de la génération du nonce, le développeur prendra soin d'utiliser un nom d'action qui contient l'identifiant de l'élément à supprimer. Ainsi, si un lien était forgé pour opérer sur un autre identifiant, le nonce ne serait pas valide et l'action ne pourrait être exécutée.

Génération du nonce

La fonction wp_nonce_url() permet de générer l'URL d'un lien auquel le nonce sera ajouté en paramètre.

Cette fonction attend les paramètres suivants :

  • URL : URL de la page où le lien mènera (c'est à cet URL qu'un paramètre sera ajouté)
  • Action : 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. Pour plus de sécurité, on y ajoutera l'identifiant de l'élément sur lequel on désire travailler. Par défaut, ce paramètre prend la valeur -1.
  • Nom : il s'agit de l'attribut name à donner au paramètre ajouté à l'URL. Par défaut, ce sera _wpnonce.
Fichier functions.php ou son sous-fichier tableau-de-bord-pages.php

// chaîne au format https://mondomaine.com/wp-content/themes/monthemeenfant/supprimer-item.php?id=3
$url_suppression = get_stylesheet_directory_uri() . "/suppression-item.php?id=$enreg->id";

// chaîne au format https://mondomaine.com/wp-content/themes/monthemeenfant/supprimer-item.php?id=3&_wpnonce=95b1af2ea2
$url_suppression_protege = wp_nonce_url( $url_suppression, "supprimer_item_$enreg->id" );

Vérification de la validité du nonce reçu dans l'URL

La vérification du nonce sera exécutée avant de procéder à la suppression (ou à toute autre action prévue par le lien).

Page d'atterrissage du lien (PHP)

$nonce_valide = false;
 
if ( isset( $_GET['_wpnonce'] ) ) {   // si la page a reçu le nonce en paramètre 
    if ( isset( $_GET['id'] ) ) {
 
        $id = $_GET['id'];
 
        if ( wp_verify_nonce( $_GET['_wpnonce'], "supprimer_item_$id" ) ) {
            $nonce_valide = true;
        } 
    }
}
 
if ( $nonce_valide ) {
    ...   // effectuer l'action prévue par le lien
} 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