WPMarmite

🛡 Point SECU #23 : Découvrez les fonctions de sécurité de WordPress

Salut à tous 👋et bienvenue dans le Point Sécu avec Julio de SecuPress. Aujourd’hui, on va voir des fonctions de sécurisation de WordPress.

Ca va être un petit peu plus technique, mais ne vous inquiétez pas Julio va vous expliquer ça comme il faut.

Allez c’est parti !

Alors Julio voilà on va faire une vidéo de code sans trop montrer de code, mais il y a un tous les morceaux de code en-dessous bien sûr.

Donc, qu’est-ce que tu peux nous expliquer un petit peu sur ces fonctions : à quoi elles servent, qu’est ce que tu peux nous expliquer ? En tout cas, ça s’adresse aux développeurs de thèmes, de plugins.

>>Julio : exactement, donc c’est pour les développeurs de thèmes et de plugins, pour autant il y a du code, mais avant de se lancer dans le code, il va falloir comprendre pourquoi est-ce qu’il faut utiliser telle ou telle fonction, à quoi ça sert.

Les nonces ou jetons de sécurité

On va parler de quelque chose dont vous avez déjà sûrement tous entendu parler ou au moins lu quelque part c’est les “nonces” “number once” ce qui signifie un chiffre utilisé une fois. On les appelle aussi en français des jetons de sécurité.

Bon d’abord à quoi ça sert un jeton de sécurité ? Ca sert à s’assurer que l’action qui est lancée, donc un formulaire ou un lien à cliquer est bien lancée par la personne et donc que la personne désirait vraiment faire cette action.

Je prends un exemple :

Je n’ai pas de jetons de sécurité sur un lien qui me permet de supprimer un article WordPress.

Donc j’ai le nom de mon site ?action = delete e id = 1ça veut dire que je vais supprimer l’article 1 donc ça c’est mon lien.

Si moi je suis un visiteur et que j’essaie de cliquer sur ce lien,  on va me dire “vous n’avez pas les droits”, si je suis inscrit dans ce site, je clique, on va me dire “vous n’avez toujours pas les droits” !

Ben non, il faut être administrateur.

Maintenant je vais donner ce lien à un administrateur

>>Alex : tu l’envoies par email…

>>Julio :  je l’envoie par email en disant “tiens regarde tu es en photo à cet endroit” je change le texte du lien pour pas qu’il voit exactement ce qui est écrit.

En cliquant il va ouvrir la page sur son administration, qui va supprimer l’article, 1 puisqu’il est administrateur, il a les droits.

Qu’est-ce qui se passe : il vient de supprimer l’article 1, mince !

Et là il se dit OK donc là je me suis fait avoir : oui il s’est fait avoir.

Maintenant faisons la même chose avec un jeton de sécurité :

Le jeton de sécurité c’est donc une petite chaîne de caractères, alors dans WordPress il fait 8 caractères ou 10 je crois : 10.

Elle est générée pour une session donnée c’est-à-dire :

Puisque rappelez-vous, on a parlé des clés de sécurité qui étaient générées, eh bien tout ça c’est pris en compte, il y a beaucoup de paramètres qui font que ce nonce va être unique à un instant pour une action.

Après ce jeton, dans WordPress, il est valable 12 à 24 heures, pour pas que, si on ouvre une page deux minutes après, c’est terminé, on se prend trop d’erreurs.

Donc je donne ce lien à Alex, mais comme le jeton de sécurité a été fait pour moi, on va lui dire “non je ne peux pas valider l’action, le jeton n’est pas correct” et moi je ne peux pas deviner son jeton c’est absolument impossible.

Voilà à quoi sert un jeton de sécurité.

>>Alex : quand je le fais une action, par exemple mettre à jour, publier, supprimer, en fait WordPress attend le jeton.

>>Julio : c’est simple, s’il n’y a pas de jeton tu ne peux rien faire…

>>Alex : c’est comme la clé, ça rentre dans la serrure c’est le bon truc ça passe, c’est pas ça, ça passe pas !

>>Julio : il y a bien une histoire de droits, c’est-à-dire l’administrateur a le droit de supprimer, mais ce n’est pas parce qu’il a le droit qui le voulait, donc il y a une différence avec le fait qu’il puisse le faire, ou qu’il veuille le faire, et le jeton, ça veut dire “je veux le faire” voyez ce n’est pas que les droits.

Quand un développeur vérifie des droits souvent c’est écrit “current user can administrator ou manage option“, ce n’est pas suffisant, on ne peut pas juste vérifier ça, parce qu’il suffirait de forcer un administrateur à le faire et ça c’est possible.

Donc avec le jeton de sécurité, on est certain que l’action est faite par la personne désirée, donc ça c’est un premier point important.

>>Alex :  il y aura l’exemple en dessous

>Julio : on va faire un petit exemple mauvais avec un bon exemple en dessous.

Les chaînes de caractères

Maintenant parlons des chaînes de caractères qu’on va afficher dans un site en étant certain de ce qu’on affiche.

Donc je prends un exemple très basique :

Si je fais un “echo” de ce qui arrive en paramètre de ma barre d’URL, donc c’est ce qu’on appelle un “get”, donc il y a un paramètre par exemple text=bonjour : le texte va s’écrire dans mon site, ça va être écrit “bonjour” très bien, mais qu’est-ce qui m’empêche dans cette barre d’adresse d’ajouter des balises JavaScript et d’insérer du JavaScript et l’intérieur ? En fait il n’y a rien qui m’en empêche !

Donc tout ce qui vient de la barre d’adresse s’écrira sur mon site. Donc ce que je vais faire, je vais écrire une URL JavaScript qui va chercher un script malicieux, je donne cette URL à un administrateur “echo”, ça va s’écrire chez lui et lui le JavaScript va être exécuté.

Et donc potentiellement avec le JavaScript :

donc c’est très dangereux.

Donc il y a trois choses à faire :

  1. soit on échappe
  2. soit on désinfecte et on sanitize
  3. ou soit on valide les choses

et alors là, la chose à faire c’est se dire “OK, qu’est ce que je fais” : les trois ne sont pas à faire, parfois il faut en faire deux, parfois il faut faire un seul, mais pas n’importe lequel, dans le cas présent je n’ai pas envie et je n’avais pas prévu qu’on puisse jouer avec des balises HTML et JavaScript.

Donc ce que je vais faire, c’est ce qu’on appelle un échappement, c’est-à-dire qu’on va prendre le contenu et on va enlever certains morceaux du contenu, là je veux dire par exemple… je vais faire je ne sais, pas… on va faire, on va prendre wp_strip_all_tags

D’ailleurs je viens de confondre moi-même puisque j’ai dit échappement et j’enlève du contenu donc là c’est assez différent.

Pardon, je le refais : si j’échappe du contenu, tout ce qui va être écrit dans la barre sera écrit en tant que texte brut voilà c’est plutôt ça, donc là, quand j’échappe, le contenu est tel qu’il est mis dans la barre d’adresse, oui c’est plutôt ça,  alors qu’effectivement c’est la sanitization, la désinfection, et la désinfection va enlever des choses – je me confonds moi-même voyez – et alors que si j’échappe, tout le contenu est bien écrit.

Alors, si je n’avais pas prévu qu’on puisse écrire des balises HTML, pas de problème, je veux juste faire un échappement, elles sont écrites en dur ,cela sera écrit script, JavaScript, etc., mais ça ne va pas s’exécuter.

Inversement, si je ne veux pas qu’on puisse insérer les balises, même si elles n’ont pas d’effet, dans ces cas-là je vais “sanitize” c’est-à-dire je vais désinfecter le contenu.

Donc la phrase “bonjour JavaScript Alex” on va supprimer le contenu à l’intérieur, donc on peut utiliser wp_strip_all_tags – je mettrais bien sûr les fonctions comme on a dit dans un article en description – dans ce cas-là seuls les mots que j’ai désirés vont rester donc il va seulement rester “bonjour Alex“.

Alors qu’un échappement, c’est les fonctions WordPress qui commencent par “esc”, ce qui veut dire “escape”, donc si je fais esc_html, là ça veut dire que le contenu HTML sera affiché tel qu’il arrive sur la page.

>>Alex : avec les balises et tout ça…

>>Julio : exactement donc :

l’échappement ça sert à garder le contenu comme il est, en étant certain qu’il n’est pas dangereux

la désinfection : sanitize, ça sert à enlever du contenu qu’on ne souhaitait pas à l’intérieur.

Donc il y a plein de fonctions de sanitize, je vous mettrais encore une fois la liste en dessous.

Et il reste une troisième chose qui est la validation des données.

La validation des données

Si dans un formulaire vous mettez un champ email, qu’est ce qui empêche la personne d’écrire justement bonjour ou mettre “12” ou mettre n’importe quoi d’autre : une balise JavaScript, elle peut très bien tester ça.

Malheureusement pour vous ce champ il va servir à l’inscrire dans votre base de données dans laquelle vous allez lui envoyer un mot de passe par exemple, donc vous ne pouvez pas juste vous dire bon je vais sanitize, j’enlève les morceaux que je ne veux pas, bah non !

Le mail ne sera pas forcément bon, il ne recevra pas, etc. et en plus ça va générer des entrées en base qui ne servent à rien du tout.

L’échappement c’est pareil, on va échapper, mais finalement ce n’est pas une adresse mail, donc il va falloir valider d’abord le contenu.

Donc pour le valider, il y a par exemple la fonction is_email qui va vérifier que ce qu’on attend est bien un email.

>>Alex : que c’est au bon format

>>Julio : le bon format ! on peut vérifier aussi avec la fonction PHP filter_var avec plein de paramètres, pour dire :

A quel moment est-ce qu’on fait ça, quand c’est bloquant, on ne valide que quand c’est bloquant !

Imaginons vous demandez aussi l’âge de la personne et dans l’âge elle met “toto”, écoutez-moi je vais dire que dans ce cas-là ce n’est pas bloquant, ce n’est pas grave, elle aura 0, je ne mets pas d’âge et plus tard dans son profil elle ira le remodifier.

Donc dans ce cas-là je vais juste sanitize, je vais dire OK, je prends son contenu et je force le contenu à être un chiffre parce que c’est ce que j’attends et “toto” en chiffres ça donne zéro. Donc elle aura juste 0, je ne vais pas la bloquer pour l’âge ce n’est pas grave.

Si dans son prénom elle a tenté de mettre du JavaScript, je ne vais pas la bloquer pour ça, je sanitize, je laisse que ce qui est intéressant.

Par contre l’adresse mail c’est bloquant, parce que sans adresse mail, je ne peux pas aller plus loin dans mon formulaire, dans mon protocole, dans mon process de création de comptes, donc là je vais valider la donnée et si elle n’est pas bonne, je renvoie sur une erreur pour dire “l’adresse e-mail est invalide“.

S’il y a des informations vraiment obligatoires qui vous bloquent à l’inscription – bon je prends l’exemple d’un formulaire d’inscription bien sûr – ça vous validez, vous ne validez pas, vous renvoyez des erreurs.

Pour tout le reste, on fait du sanitize, comme ça vous avez des données propres et pour ce qui est de l’affichage vous pouvez échapper si ça ne vous dérange pas, de ce qui est créé, sinon vous pouvez aussi sanitize pour enlever le contenu qui ne vous intéresse pas.

WPMarmite News, votre antisèche sur l’actu WordPress

Recevez gratuitement les dernières infos de l’écosystème WordPress tous les 15 jours et créez de meilleurs sites.

Conclusion

Donc il y a donc :

>>Alex : OK donc trois groupes de fonctions à bien les connaître, donc pour les personnes qui nous écoutent pourront creuser avec ton article juste en dessous.

>>Julio : il y a beaucoup de fonctions, il faut comprendre que les fonctions sont utilisables dans des contextes, que vous pouvez sanitize certains contenus, certains autres avec d’autres fonctions.

Comme il y a pas mal de fonctions de toute façon, ce qu’il faut faire c’est lire, vous lisez, vous lisez, vous lisez, vous lisez bien la doc et ensuite vous saurez à quel moment il faut l’utiliser quoi !

C’est une histoire de pratique de toute façon.

>>Alex : OK super bon ben merci d’avoir écouté cette vidéo un petit peu plus de technique et donc bien sûr n’oubliez pas le petit pouce bleu !

Abonnez-vous aussi à la chaîne de WPMarmite et allez voir SecuPress.me pour en savoir plus sur la sécurité WordPress et vous mettre à l’abri et donc à très bientôt pour les prochaines vidéos.

Au revoir, ciao, 👋

Quitter la version mobile