Les nonces dans WordPress

Les nonces (Number used ONCE, c'est-à-dire numéro utilisé une seule fois) sont un mécanisme permettant de prévenir les attaques de type Cross-Site Request Forgery (CSRF). Ils permettent donc d'assurer, avant d'effectuer un traitement, que l'envoi du formulaire ou le clic sur le lien ayant déclenché l'action provient bel et bien légitimement de votre site et non d'un script ou d'un lien malicieux.

▼Publicité

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.

On peut utiliser les nonces pour protéger les formulaires ou pour protéger les liens menant à une action. Il n'est pas utile de mettre en place un mécanisme de nonce sur un formulaire grand public. Le nonce servira plutôt à protéger les opérations nécessitant qu'un usager soit authentifié.

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 identifiant l'action,
  • l'identifiant de l'usager authentifié,
  • le jeton identifiant 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 sera le suivant :

  • Lors de l'affichage d'un formulaire ou d'un lien, un nonce sera généré.
  • Pour que le nonce puisse être vérifié, un mécanisme permettra 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 qu'il y a ait égalité, il faut d'abord qu'un nonce ait été reçu. Il faut également que la même personne soit authentifiée, que le délai soit en deçà de la période de validité du nonce, que la chaîne identifiant l'action soit la même, etc. 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

« WordPress 2.0.3: Nonces ». Mark on WordPress. http://markjaquith.wordpress.com/2006/06/02/wordpress-203-nonce 

« How to Secure WordPress Plugins ». Clivern. http://clivern.com/how-to-secure-wordpress-plugins/

« NONCE Upon a time in WordPress ». Pantheon. https://pantheon.io/blog/nonce-upon-time-wordpress

« Is wp_nonce_field vulnerable if you know the action name? ». WordPress Development. http://wordpress.stackexchange.com/questions/141836/is-wp-nonce-field-vulnerable-if-you-know-the-action-name

« Capabilities and Nonces ». Tuts +. http://code.tutsplus.com/tutorials/capabilities-and-nonces--wp-25827

« Nonces on the Front End is a Bad Idea ». Konstantin Kovshenin. http://kovshenin.com/2012/nonces-on-the-front-end-is-a-bad-idea/

« WordPress caching and nonce lifespan ». myatus. http://myatus.com/p/wordpress-caching-and-nonce-lifespan/

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