Introduction aux nonces de wordpress

Que signifie les “nonces” de wordpress ?

Le mot «nonce» est une abréviation anglaise pour indiquer que le numéro est utilisé une fois. Il s’agit d’une chaîne générée par WordPress qui agit comme un jeton spécial (token) et est utilisé pour identifier la personne qui effectue une opération spécifique telle que la soumission d’un formulaire, la suppression d’un article etc.

Pourquoi utiliser les nonces ?

Le but principal du nonce est de protéger contre les attaques de piratage malveillants tels que une technique connue sous le nom “Cross Site Request Forgery” (CSRF) qui consiste à tromper les gens en cliquant sur un lien qui causera des dommages à votre site.

Une autre façon de décrire un nonce est qu’il est un peu comme une clé secrète temporaire ou empreinte digitale qui est unique à vous et ne peut jamais être utilisé que par vous pour une opération spécifique. Cette clé est extrêmement difficile d’être deviné par quelqu’un d’autre.

Comment fonctionne les nonces ?

La valeur nonce est valable 24 heures après sa génération.
Cela garantit que quelqu’un ne peut pas copier un ancien nonce et le ré-utiliser dans l’URL ou lors de la soumission d’un formulaire.

Les nonces sont largement utilisés dans la fonctionnalité de base de WordPress sans que l’ayez peut être remarqué. Par exemple, disons que vous êtes un administrateur d’un blog WordPress et que vous voulez supprimer un compte d’utilisateur spécifique.

Lorsque vous cliquez sur le lien “supprimer”, WordPress va générer un nonce et il va ajouter dans l’URL comme suit:

http://www.xyz.com/wp-admin/users.php?action=delete&user=2&_wpnonce=13eyha2g22

Le nonce ci-dessus sera valide uniquement pendant 24 heures et il ne pourra être utilisé que par vous et uniquement pour cette opération spécifique – qui dans ce cas est la suppression de l’utilisateur avec l’identifiant de “2”.

Maintenant, disons que les moments de supprimer après avoir réussi à l’utilisateur que vous vouliez aussi supprimer un message. Lorsque vous cliquez sur le lien “corbeille” pour supprimer l’article avec l’ID 10, WordPress va de nouveau générer une nouvelle valeur de nonce spécifiquement pour cette opération:

http://www.xyz.com/wp-admin/post.php?post=10&action=trash&_wpnonce=3a6dc727ba

Notez comment la valeur de ce nonce est différente de la première et encore la règle applicable est ici en ce qu’elle ne sera valable que pendant 24 heures et ne peut être utilisé pour la suppression (corbeille d’action) de l’article avec l’ID 1 .

Ainsi, lorsqu’un utilisateur clique sur un lien dans le panneau d’administration tels que les liens de suppression ou de déchets dans les exemples ci-dessus, WordPress va faire des vérifications dans les coulisses pour vérifier que le paramètre “_wpnonce” est valide et si et seulement si elle est valide, il va procéder à l’achèvement de la requête.

Si la valeur de “_wpnonce” a été jugée invalide, alors WordPress ne permettra pas le fonctionnement et l’utilisateur serait accueilli avec un écran qui leur indique l’erreur.

Utiliser les nonces

Si vous développé sur WordPress, alors vous devriez apprendre et utiliser les nonces.

WordPress a plusieurs fonctions utiles à votre disposition que vous pouvez utiliser pour toutes les questions liées aux nonces.

Création de nonce:

Il y a des fonctions pour créer et ajouter des nonces à vos URL et les formulaires dans WordPress.

Ajouter des nonces à vos urls

Par exemple, WordPress a la fonction suivante qui va créer un nonce que vous pouvez ajouter manuellement à votre URL:

wp_create_nonce ($action)

Cette fonction va créer une valeur nonce et comme vous pouvez le voir prend un seul argument, qui est une chaîne définissant l’action que vous effectuez.

La chaîne peut être tout ce que vous voulez et il est souhaitable que vous choisissez quelque chose d’unique à votre plugin qui sera difficile à deviner.

La fonction retourne une chaîne sous la forme de la valeur de jeton nonce.

Exemple 1:

Par exemple, supposons que vous avez écrit un plugin qui a une page avec une liste d’articles avec un lien de suppression à côté de chaque élément. Afin d’améliorer encore la sécurité que vous souhaitez ajouter un nonce au lien de suppression.

Ce qui suit est une façon vous pouvez le faire en utilisant la fonction ci-dessus:

1) Tout d’abord, vous devez créer le nonce:

$my_nonce = wp_create_nonce ('delete_my_rec');

2) Ensuite, vous devez ajouter ce nonce à votre URL:

admin.php?page=mypluginpage&action=delete&recid=1&_wpnonce=<?php echo $my_nonce ?>

Une autre façon d’ajouter un nonce à une URL est d’utiliser la fonction suivante:

wp_nonce_url ($actionURL, $action)

Cette fonction prend deux paramètres:

  • La première est l’URL que vous souhaitez ajouter le nonce à
  • Le second est le nom de l’action que vous souhaitez attribuer au nonce.

Si vous regardez à l’intérieur du code de base WordPress, vous verrez que la fonction wp_nonce_url appelle en fait la fonction wp_create_nonce pour créer le nonce auquel il ajoute alors à la chaîne d’URL.

Exemple 2:

Par conséquent, nous pouvons utiliser la fonction wp_nonce_url pour atteindre le même résultat que dans le premier exemple en faisant simplement ce qui suit:

1) Créer l’URL avec un nonce ajouté à cela:

$nonced_url = wp_nonce_url('admin.php?page=mypluginpage&action=delete&recid=1', 'Delete_my_rec');

2) Maintenant, ajoutez l’URL contenant le nonce à notre page:

<a href="'.$nonced_url.'">suppression</a>

Ce second exemple permettra d’atteindre le même résultat que le premier exemple.

Ajout d’un nonce à un formulaire

Pour ajouter un nonce à un formulaire, vous pouvez utiliser la fonction suivante:

wp_nonce_field($action, $name, $referer, $echo)

Cette fonction prend 4 paramètres qui sont tous en option:

  • $action = (en option) ceci est une chaîne qui représente le nom de l’action
  • $name = (facultatif) ceci est une chaîne qui représente le nom du nonce. Si vous laissez ce champ vide WordPress sera par défaut “_wpnonce”
  • $referer = (en option) ceci est un booléen. Il détermine si le referer “champ de formulaire caché” doit être créé. Ceci est essentiellement la valeur “REQUEST_URI” de la page de référence qui est stocké dans le $ _SERVER de PHP. Si il n’est pas inclus, il est par défaut à true.
  • $echo = (en option) ceci est un booléen. Il détermine si WordPress devrait l’écho du champ caché apax ou retourner sa valeur. Si il n’est pas inclus, il est par défaut à true.

Cette fonction retournera une chaîne d’URL qui contiendra l’action nonce.

Exemple 3:

Une utilisation typique de cette fonction est indiquée dans l’exemple ci-dessous:

<form action = "" method = "post">
<?php wp_nonce_field ('my_delete_action'); ?>
<input type = nom = valeur "hidden" "id" = "<?php echo $id;?>" />
<input type = "text" name = valeur "rec_name" = "<?php echo $name;?>" />
<input type = "submit" value = "Supprimer" />
</form>

Notez comment nous avons inséré notre champ nonce caché à l’intérieur de la forme en utilisant la fonction de wp_nonce_field et nous avons inclus un seul paramètre “my_delete_action” qui représente le nom de l’action de notre nonce.

Vérification des nonces

Création et insertion nonces dans notre code est seulement la moitié du travail qui doit être fait.

Nous devons également vérifier les nonces lorsque l’utilisateur tente d’envoyer un formulaire ou effectue une action via une URL.

Pour vérifier un nonce nous pouvons simplement utiliser la fonction WP suivant:

wp_verify_nonce ($nonce, $action)

Cette fonction prend 2 paramètres:

  • $nonce = (obligatoire) ceci est le nonce particulier que vous souhaitez vérifier
  • $action = (en option), c’est l’action que vous avez spécifié pour le nonce lors de sa création.

La fonction ci-dessus retourne une valeur booléenne “false” si le nonce était invalide; sinon elle retournera un entier à partir du moment où le nonce a été généré, à savoir,

Il renverra “1” si le nonce a été généré il y a moins de 12 heures.

Il renverra “2” si le nonce a été généré plus de 12 heures et moins de 24 heures plus tôt.

Exemple 4:

Par conséquent, en utilisant notre nonce que nous avons créé dans l’exemple 1, nous pouvons maintenant étendre notre code pour inclure la vérification suivante:

$retrieved_nonce = $_REQUEST['_wpnonce'];
if (!wp_verify_nonce($retrieved_nonce, 'delete_my_rec' ) ) die( 'Failed security check' );

Une autre façon de vérifier nonces

Vous pouvez également utiliser la fonction suivante pour vérifier votre nonce:

check_admin_referer ($action, $query_arg)

Explications:

  • $action = (en option) est le nom de l’action. Il est fortement recommandé d’inclure ce domaine lors de l’appel de cette fonction.
  • $query_arg = (facultatif) désigne le nom qui nonce WordPress va chercher dans la variable $ _REQUEST. (Par défaut _wpnonce si laissée en blanc)

Si le nonce est valide la fonction permet l’exécution de votre plugin procéder autrement il «mourir» et l’utilisateur vers le «êtes-vous sûr” page d’erreur si elle détermine qu’un nonce est invalide.

Exemple 5:

Nous pourrions donc utiliser la ligne de code ci-dessous pour remplacer le code de l’exemple 4 pour obtenir un résultat similaire:

check_admin_referer ('delete_my_rec');

Tag nonce
Pierre-alexandre Thomas

Passionné par le développement web et la programmation, je suis développeur web dans une agence de communication. Depuis quelques années, je me suis spécialisé dans l'expertise des CMS WordPress et PrestaShop Je développe aussi des sites sur Drupal, Joomla et Typo3. Je me passionne également pour les framework Javascript (Vue.js, Angular et React), aux problématiques d'UX/UI, ainsi qu'au "refactoring"