Travailler avec des champs centrés sur l’utilisateur dans WordPress – tels que inputdes éléments, textareades éléments ou tout type de champ dans lequel un utilisateur peut fournir ses propres valeurs est un endroit qui devrait toujours être une cible de désinfection.
Heureusement, l’API WordPress fournit un certain nombre de fonctions pour vous aider. Selon votre cas d’utilisation, vous devrez peut-être effectuer l’une des opérations suivantes :
Et tout cela est bien beau, mais il existe également des moyens de nettoyer les données à l’aide des fonctions fournies par PHP.
Bien sûr, parfois les expressions régulières sont la voie à suivre, mais d’autres fois, vous voudrez peut-être utiliser des fonctionnalités intégrées au langage, plus faciles à comprendre et plus faciles à suivre.
Lors de l’écriture de mon propre code (et lors de la révision des autres), j’essaie de garder cela à l’esprit. Cela dit, voici un processus que vous pouvez utiliser pour faciliter vos efforts lorsque vous travaillez avec des URL dans WordPress.
Si vous n’êtes pas prêt pour la discussion complète à ce sujet, vous pouvez passer à l’en-tête au bas de l’article qui décrit le code et comment l’utiliser dans votre travail.
Supposons que vous ayez un inputélément ouvert et que vous souhaitiez autoriser l’utilisateur à fournir une URL qui sera éventuellement rendue sur le front-end, peut-être dans un lien, dans un type de schéma ou simplement telle quelle.
Il est possible d’être vraiment agressif et de simplement faire quelque chose comme "Si ce n’est pas une URL valide, ne l’enregistrez pas".
Et, pour être clair, je ne dis pas qu’une URL valide ne renvoie pas un 404 (parce que parfois des pages existent et des années plus tard, elles ne le font pas). Je définis une URL valide comme une URL correctement formatée et ne contenant aucune information superflue.
Supposons donc que, pour les besoins de cet exemple simple, vous proposez un champ de texte qui sera éventuellement enregistré dans la table de métadonnées de la publication. De plus, vous allez supprimer tout ce qui est illégal dans une URL et ne laisser que ce qui créerait une URL valide.
Pour ce faire, je trouve les fonctions suivantes les plus utiles :
- strip_tags. Supprimez les balises HTML et PHP d’une chaîne.
- bandes de coups de fouet. Supprime les guillemets d’une chaîne entre guillemets.
- filter_var. Filtre une variable avec un filtre spécifié.
Ce dernier semble un peu déroutant car il repose sur l’idée que vous comprenez ce que sont réellement les filtres. En PHP, les filtres peuvent être décomposés en deux cas d’utilisation :
- Validation
- Assainissement
Et ce sont essentiellement des moyens prédéfinis pour nous de traiter les données de manière à déterminer s’il s’agit du type d’informations, généralement une chaîne ou un tableau, que nous recherchons.
Mettre au travail
Dans cet esprit, voici comment vous pourriez essayer d’enregistrer des informations dans la base de données sans aucun type de nettoyage (ce qui est une mauvaise chose) :
<?php
$data['url'] = 'https://tommcfarlin.com/<script type="text/javascript">alert('hello world!');</script>';
Avec le code ci-dessus, l’utilisateur peut littéralement entrer n’importe quoi dans le champ et le faire enregistrer dans la base de données. C’est pourquoi la désinfection est importante. Sans cela, l’utilisateur peut faire des ravages sur l’expérience utilisateur ou sur l’ensemble de l’installation de WordPress.
Alors, à quoi cela ressemble-t-il d’appliquer le code ci-dessus lors de la désinfection des URL ? De manière générale, cela ressemble à ceci :
<?php
if (!isset($data['url']) {
return '';
}
$url = $data['url'];
$data['url'] = strip_tags(
stripslashes(
filter_var($url, FILTER_VALIDATE_URL)) );
Tout d’abord, le code est exécuté à travers un filtre PHP qui valide une URL. Si la chaîne transmise à la fonction de filtrage ne fonctionne même pas comme une URL, la fonction renverra false.
Si, d’un autre côté, cela fonctionne comme une URL valide, nous pouvons supprimer toutes les barres obliques qui ne sont pas nécessaires. Cela signifie que nous pouvons «supprimer toutes les chaînes entre guillemets ». Plus précisément, cela supprimera la première barre oblique inverse consécutive (car, en PHP, les barres obliques inverses sont utilisées pour échapper une barre oblique inverse). Dégager? 🙂
Enfin, nous choisissons de supprimer les balises car nous ne voulons que l’URL elle-même. Nous ne voulons pas de balisage, de balises ou de tout ce qui pourrait saboter les données écrites dans la base de données. Cela signifie que si vous choisissez d’exécuter quelque chose comme :
https://tommcfarlin.com/<script type="text/javascript">alert('hello world!');</script>
Il vous restera :
"https://tommcfarlin.com/alert('hello world!');"
Donc, en rassemblant tout le code ci-dessus en utilisant cette chaîne :
https://tommcfarlin.com/<script type="text/javascript">alert('hello world!');</script>'
Se traduira par la sortie suivante :
https://tommcfarlin.com/alert('hello world!');
Ce n’est évidemment pas une URL valide, mais elle est propre, sûre et vous permet d’effectuer tout autre travail que vous pourriez avoir à faire pour valider que l’URL est sûre pour l’utilisateur.