Formation PUB020 : WordPress, 2023 Les nonces dans WordPress

39.1 Qu'est-ce qu'un nonce ?


Les nonces (Number used ONCE, c'est-à-dire nombre utilisé une seule fois) sont un mécanisme qui permet de prévenir les attaques de type Cross-Site Request Forgery (CSRF).

Ils sont utilisés pour protéger les formulaires dans le tableau de bord ou pour protéger les liens qui mènent à une action, par exemple un lien pour supprimer un enregistrement dans le tableau de bord.

Leur rôle est de d'assurer que l'envoi du formulaire ou le clic sur le lien qui a déclenché l'action provient légitimement de votre site et non d'un script ou d'un lien malicieux.

Pour s'en assurer, la page qui traite le formulaire ou la page vers laquelle le lien mène vérifiera si le nonce est valide avant d'effectuer le traitement.

Nonce

Les nonces peuvent être vus comme une clé à usage unique qui :

  • ne peut être utilisée que par une personne donnée;
  • afin d'effectuer une opération précise;
  • une seule fois.

Si la clé était volée par un utilisateur malicieux, ce dernier ne pourrait vraisemblablement pas l'utiliser pour effectuer quoi que ce soit.

Il n'est pas utile de mettre en place un mécanisme de nonce sur un formulaire grand public.

Le nonce servira à protéger les opérations qui nécessitent qu'un usager soit authentifié.

Utilisation des nonces par WordPress

Le noyau WordPress lui-même utilise les nonces pour protéger ses formulaire et ses liens menant à une action sensible.

Par exemple, dans le tableau de bord, le formulaire pour modifier un usager contient un nonce :

Nonce dans formulaire WordPress

Autre exemple, dans le tableau de bord, le lien pour supprimer une page contient lui aussi un nonce :

Nonce dans URL lien

De quoi est composé le nonce?

Par définition, un nonce doit être impossible à deviner. La fonction PHP uniqueid() ne permet donc pas de générer un nonce acceptable.

La fonction WordPress wp_create_nonce(), qui est définie dans le fichier wp-includes/pluggable.php, permet de générer un nonce. Si vous consultez le code de cette fonction, vous constaterez que le nonce est généré à partir de :

  • l'heure (le nonce sera différent à chaque période, une période pouvant durer entre 12 et 24 heures),
  • une chaîne de caractères qui identifie l'action,
  • l'identifiant de l'usager authentifié,
  • le jeton qui identifie la session,
  • le tout passé dans un algorithme de hachage avec un salage basé sur les clés que vous avez générées dans votre fichier wp-config.php

Il ne s'agit pas d'un nombre totalement indevinable mais il offre un niveau de sécurité suffisant.

Cycle de vie du nonce

Le cycle de vie du nonce va comme suit :

  • Lors de l'affichage d'un formulaire ou d'un lien, un nonce est généré.
  • Pour que le nonce puisse être vérifié, un mécanisme doit permettre de passer le nonce à la page qui effectuera le traitement du formulaire ou du lien. À cette fin, le nonce sera stocké soit dans un champ caché du formulaire, soit dans l'URL du lien. Il serait également possible de le stocker dans une variable de session.
  • Lors du traitement du formulaire ou du lien, le nonce pourra être retrouvé par $_POST, par $_GET ou par $_SESSION, selon l'endroit où il a été stocké lors de sa génération. Le programme générera à nouveau le nonce et le comparera avec celui qui a été généré à l'origine.
  • Pour que le nonce soit valide, il faut :
    • qu'un nonce ait été reçu
    • que la même personne soit authentifiée que lors de la génération du nonce
    • que le délai soit en deçà de la période de validité du nonce
    • que la chaîne qui identifie l'action soit la même

    Le traitement ne pourra donc pas avoir lieu si un faux formulaire était soumis ou si un lien était trafiqué.

  • La dernière étape du cycle de vie du nonce devrait consister à détruire le nonce. En effet, puisque le nonce est, par définition, un numéro utilisé une seule fois, sa destruction assurerait qu'une seconde soumission du même formulaire (ex : en rafraîchissant la page de soumission) ne puisse pas mener à un second traitement. Cette étape n'est cependant pas possible avec le mécanisme de nonce implanté dans WordPress. Les concepteurs de WordPress ont plutôt choisi de travailler avec un nonce qui expire après une certaine période de temps.

Fonctions WordPress pour gérer les nonces

WordPress met à votre disposition plusieurs fonctions pour faciliter le travail avec les nonces :

  • wp_nonce_field() : génère un champ caché contenant la valeur du nonce.
  • wp_nonce_url() : génère un URL contenant la valeur du nonce en paramètre.
  • wp_create_nonce() : génère un nonce. Cette fonction est appelée par wp_nonce_field() et par wp_nonce_url().
  • wp_verify_nonce() : vérifie la validité du nonce reçu en paramètre en tenant compte de l'usager authentifié, de l'heure et de l'action effectuée.
  • check_admin_referer() : cette fonction vérifie si le nonce est effectivement passé dans un champ caché ou dans un paramètre de l'URL puis appelle wp_verifiy_nonce() pour vérifier la validité du nonce. Le nom de cette fonction n'est plus significatif mais il est conservé pour des raisons de compatibilité.
  • check_ajax_referer() : vérifie la validité du nonce lorsqu'utilisé pour valider un appel AJAX.
  • wp_nonce_ays() : cette fonction peut être utilisée lorsqu'un nonce n'est pas valide afin de générer un code 403 (accès refusé) et afficher le message « Are you sure you want to do this? » (ou sa traduction).

Pour plus d'information

« Les Nonces WordPress ». Codex WordPress. http://codex.wordpress.org/fr:Les_Nonces_WordPress

▼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