Utilisation d’un nonce dans WordPress pour protéger un lien menant à une action

Les nonces sont un mécanisme intéressant pour prévenir certaines attaques CSRF. Ce type d'attaque peut survenir notamment lorsqu'un lien mène vers une action en passant des paramètres dans l'URL.

▼Publicité

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. Ces liens mènent à un URL au format :

http://mondomaine.com/wp-admin/admin.php?page=monprefixe_gestion&id=48&action=trash

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 représentant 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.

Ex :

WordPress (PHP)

// chaîne au format http://mondomaine.com/wp-admin/admin.php?page=monprefixe_gestion&id=3&action=trash

$url_suppression = admin_url( "admin.php?page=monprefixe_gestion&id=$id&action=trash" );

// chaîne au format http://mondomaine.com/wp-admin/admin.php?page=monprefixe_gestion&id=3&action=trash&_wpnonce=95b1af2ea2

$url_suppression_protege = wp_nonce_url( $url_suppression, "supprimer_item_$id" );

Vérification de la validité du nonce

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

Ex :

WordPress (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

}

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories