{"id":230505,"date":"2022-12-01T15:54:00","date_gmt":"2022-12-01T12:54:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230505"},"modified":"2022-11-09T22:41:08","modified_gmt":"2022-11-09T19:41:08","slug":"desinfection-des-url-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/desinfection-des-url-dans-wordpress\/","title":{"rendered":"D\u00e9sinfection des URL dans WordPress"},"content":{"rendered":"\n<p>Travailler avec des champs centr\u00e9s sur l&rsquo;utilisateur dans WordPress &#8211; tels que <code>input<\/code>des \u00e9l\u00e9ments, <code>textarea<\/code>des \u00e9l\u00e9ments ou tout type de champ dans lequel un utilisateur peut fournir ses propres valeurs est un endroit qui devrait toujours \u00eatre une cible de d\u00e9sinfection.<\/p>\n<p>Heureusement, l&rsquo;API WordPress fournit <strong><a href=\"https:\/\/codex.wordpress.org\/Validating_Sanitizing_and_Escaping_User_Data\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un certain nombre de fonctions<\/a><\/strong> pour vous aider. Selon votre cas d&rsquo;utilisation, vous devrez peut-\u00eatre effectuer l&rsquo;une des op\u00e9rations suivantes\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/sanitize_text_field\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sanitize_text_field<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/esc_url\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esc_url<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/sanitize_textarea_field\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sanitize_textarea_field<\/a><\/li>\n<li>ou <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/formatting.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">plus<\/a><\/strong><\/li>\n<\/ul>\n<p>Et tout cela est bien beau, mais il existe \u00e9galement des moyens de nettoyer les donn\u00e9es \u00e0 l&rsquo;aide des fonctions fournies par PHP.<\/p>\n<p>Bien s\u00fbr, parfois les expressions r\u00e9guli\u00e8res sont la voie \u00e0 suivre, mais d&rsquo;autres fois, vous voudrez peut-\u00eatre utiliser des fonctionnalit\u00e9s int\u00e9gr\u00e9es au langage, plus faciles \u00e0 comprendre et plus faciles \u00e0 suivre.<\/p>\n<p>Lors de l&rsquo;\u00e9criture de mon propre code (et lors de la r\u00e9vision des autres), j&rsquo;essaie de garder cela \u00e0 l&rsquo;esprit. Cela dit, voici un processus que vous pouvez utiliser pour faciliter vos efforts lorsque vous travaillez avec des URL dans WordPress.<\/p>\n<p>Si vous n&rsquo;\u00eates pas pr\u00eat pour la discussion compl\u00e8te \u00e0 ce sujet, vous pouvez passer \u00e0 l&rsquo;en-t\u00eate au bas de l&rsquo;article qui d\u00e9crit le code et comment l&rsquo;utiliser dans votre travail.<\/p>\n<p>Supposons que vous ayez un <code>input<\/code>\u00e9l\u00e9ment ouvert et que vous souhaitiez autoriser l&rsquo;utilisateur \u00e0 fournir une URL qui sera \u00e9ventuellement rendue sur le front-end, peut-\u00eatre dans un lien, dans un type de sch\u00e9ma ou simplement telle quelle.<\/p>\n<p>Il est possible d&rsquo;\u00eatre vraiment agressif et de simplement faire quelque chose comme &quot;Si ce n&rsquo;est pas une URL valide, ne l&rsquo;enregistrez pas&quot;.<\/p>\n<p>Et, pour \u00eatre clair, je ne dis pas qu&rsquo;une URL valide ne renvoie pas un 404 (parce que parfois des pages existent et des ann\u00e9es plus tard, elles ne le font pas). Je d\u00e9finis une URL valide comme une URL correctement format\u00e9e et ne contenant aucune information superflue.<\/p>\n<p>Supposons donc que, pour les besoins de cet exemple simple, vous proposez un champ de texte qui sera \u00e9ventuellement enregistr\u00e9 dans la table de m\u00e9tadonn\u00e9es de la publication. De plus, vous allez supprimer tout ce qui est ill\u00e9gal dans une URL et ne laisser que ce qui cr\u00e9erait une URL valide.<\/p>\n<p>Pour ce faire, je trouve les fonctions suivantes les plus utiles\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.strip-tags.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">strip_tags<\/a>. Supprimez les balises HTML et PHP d&rsquo;une cha\u00eene.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.stripslashes.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">bandes de coups de fouet<\/a>. Supprime les guillemets d&rsquo;une cha\u00eene entre guillemets.<\/li>\n<li><a href=\"https:\/\/secure.php.net\/manual\/en\/function.filter-var.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">filter_var<\/a>. Filtre une variable avec un filtre sp\u00e9cifi\u00e9.<\/li>\n<\/ul>\n<p>Ce dernier semble un peu d\u00e9routant car il repose sur l&rsquo;id\u00e9e que vous comprenez ce que sont r\u00e9ellement les filtres. En PHP, les filtres peuvent \u00eatre d\u00e9compos\u00e9s en deux cas d&rsquo;utilisation\u00a0:<\/p>\n<ol>\n<li>Validation<\/li>\n<li>Assainissement<\/li>\n<\/ol>\n<p>Et ce sont essentiellement des moyens pr\u00e9d\u00e9finis pour nous de traiter les donn\u00e9es de mani\u00e8re \u00e0 d\u00e9terminer s&rsquo;il s&rsquo;agit du type d&rsquo;informations, g\u00e9n\u00e9ralement une cha\u00eene ou un tableau, que nous recherchons.<\/p>\n<h3>Mettre au travail<\/h3>\n<p>Dans cet esprit, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/590bbb593f01fe95ce0b11106e7e86cb#file-00-saving-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">voici comment vous pourriez essayer<\/a><\/strong> d&rsquo;enregistrer des informations dans la base de donn\u00e9es sans aucun type de nettoyage (ce qui est une mauvaise chose)\u00a0:<\/p>\n<pre><code>&lt;?php\n$data['url'] = 'https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;';\n<\/code><\/pre>\n<p>Avec le code ci-dessus, l&rsquo;utilisateur peut litt\u00e9ralement entrer n&rsquo;importe quoi dans le champ et le faire enregistrer dans la base de donn\u00e9es. C&rsquo;est pourquoi la d\u00e9sinfection est importante. Sans cela, l&rsquo;utilisateur peut faire des ravages sur l&rsquo;exp\u00e9rience utilisateur ou sur l&rsquo;ensemble de l&rsquo;installation de WordPress.<\/p>\n<p>Alors, \u00e0 quoi cela ressemble-t-il d&rsquo;appliquer le code ci-dessus lors de la d\u00e9sinfection des URL\u00a0? De mani\u00e8re g\u00e9n\u00e9rale, cela <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/590bbb593f01fe95ce0b11106e7e86cb#file-01-serializing-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ressemble \u00e0 ceci<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\nif (!isset($data['url']) {\n   return '';\n}\n\n$url = $data['url'];\n$data['url'] = strip_tags(\n  stripslashes(\n    filter_var($url, FILTER_VALIDATE_URL)) );\n<\/code><\/pre>\n<p>Tout d&rsquo;abord, le code est ex\u00e9cut\u00e9 \u00e0 travers un filtre PHP qui valide une URL. Si la cha\u00eene transmise \u00e0 la fonction de filtrage ne fonctionne m\u00eame pas comme une URL, la fonction renverra <code>false<\/code>.<\/p>\n<p>Si, d&rsquo;un autre c\u00f4t\u00e9, cela fonctionne comme une URL valide, nous pouvons supprimer toutes les barres obliques qui ne sont pas n\u00e9cessaires. Cela signifie que nous pouvons \u00absupprimer toutes les cha\u00eenes entre guillemets \u00bb. Plus pr\u00e9cis\u00e9ment, cela supprimera la premi\u00e8re barre oblique inverse cons\u00e9cutive (car, en PHP, les barres obliques inverses sont utilis\u00e9es pour \u00e9chapper une barre oblique inverse). D\u00e9gager? \ud83d\ude42<\/p>\n<p>Enfin, nous choisissons de supprimer les balises car nous ne voulons que l&rsquo;URL elle-m\u00eame. Nous ne voulons pas de balisage, de balises ou de tout ce qui pourrait saboter les donn\u00e9es \u00e9crites dans la base de donn\u00e9es. Cela signifie que si vous choisissez d&rsquo;ex\u00e9cuter quelque chose comme\u00a0:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;<\/code><\/pre>\n<p>Il vous restera :<\/p>\n<pre><code>\"https:\/\/tommcfarlin.com\/alert('hello world!');\"<\/code><\/pre>\n<p>Donc, en rassemblant tout le code ci-dessus en utilisant cette cha\u00eene\u00a0:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;'<\/code><\/pre>\n<p>Se traduira par la sortie suivante\u00a0:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/alert('hello world!');<\/code><\/pre>\n<p>Ce n&rsquo;est \u00e9videmment pas une URL valide, mais elle est propre, s\u00fbre et vous permet d&rsquo;effectuer tout autre travail que vous pourriez avoir \u00e0 faire pour valider que l&rsquo;URL est s\u00fbre pour l&rsquo;utilisateur.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Trois fonctions que vous pouvez utiliser conjointement les unes avec les autres pour nettoyer correctement les URL dans WordPress avant de les \u00e9crire dans la base de donn\u00e9es.<\/p>\n","protected":false},"author":1,"featured_media":163470,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,801,841,862],"tags":[1167],"class_list":["post-230505","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-php-3","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=230505"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230505\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/163470"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}