5
Fév
09

Utiliser le nonce dans son plugin WordPress





Vous le savez probablement, Internet est une jungle où les hackers s’amusent à trouver des failles de sécurité pour pirater les sites. Si vous écrivez un plugin wordpress, il faut essayer de le sécuriser un minimum afin d’éviter qu’il ouvre des portes d’entrée sur votre blog (voire votre base de données).

Lorsque l’on soumet un formulaire (form submit en post ou get), il y a une interaction avec le server qui va parser et exploiter les données que vous lui envoyez. Le problème est que cela doit se faire suivant une séquence bien précise avec un certain nombre de contrôles. Si un utilisateur parvient à soumettre ses données directement en outrepassant ces contrôles, il y a un risque pour le système car il peut alors soumettre n’importe quoi ou profiter de privilèges dont il ne dispose pas.

Le nonce field permet d’empêcher cela. Toute soumission directe sera bloquée grâce à ce système.

Comment est ce que cela fonctionne techniquement? Le système vous fournit une clé lors du chargement du formulaire. Vous allez soumettre au système votre formulaire rempli. Celui-ci va alors vérifier que la clé fournie est bien celle qu’il récupère dans le formulaire soumis. Si ce n’est pas le cas, cela veut dire que vous n’avez pas soumis vos données via le formulaire qu’il vous a fourni et donc il rejette la soumission!

Vous trouverez sur wikipedia un joli schéma qui explique tout ça très bien.

Concrètement, pour implémenter cette protection au niveau des formulaires de votre plugin, il faut procéder de la manière suivante :

1/ Entre les balises <form></form> vous insérez le code suivant :

<form action= » » method= »post »>
<?php wp_nonce_field(‘myplugin-nonce-form1’); ?></form>

2/ Au niveau de la fonction de retour du formulaire où vous avez le $_POST, vous faites le check sur le nonce :

if (isset($_POST[‘submit’]))
check_admin_referer(‘myplugin-nonce-form1’)

Si vous voulez vérifier que le mécanisme fonctionne bien, insérez juste le code de la seconde partie (le check). Comme vous n’aurez pas inséré le nonce dans le formulaire, la clé ne sera pas soumise et WordPress rejettera la soumission.

Si on soulève le capôt, voici ce que wordpress va insérer dans le code HTML de la page contenant le formulaire :

<input id= »_wpnonce » name= »_wpnonce » type= »hidden » value= »71fd0b1cc7″ /><input name= »_wp_http_referer » type= »hidden » value= »page.php » />

Il soumet donc un champ caché et en test ensuite la valeur. Le hacker pourra toujours essayer de reproduire ça, il n’a aucune chance d’y parvenir sachant que la clé change à chaque passage.

wordpress-plugin-button Retour au sommaire du dossier sur l’écriture d’un plugin wordpress







L'autre monde | Thème liquide par Olivier