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.
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 :
// 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" );
La vérification du nonce sera exécutée avant de procéder à la suppression (ou à toute autre action prévue par le lien).
$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é