{"id":230232,"date":"2022-12-01T16:15:00","date_gmt":"2022-12-01T13:15:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230232"},"modified":"2022-11-09T20:42:53","modified_gmt":"2022-11-09T17:42:53","slug":"desinfectando-urls-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/desinfectando-urls-en-wordpress\/","title":{"rendered":"Desinfectando URLs en WordPress"},"content":{"rendered":"\n<p>Trabajar con campos centrados en el usuario en WordPress, como <code>input<\/code>elementos, <code>textarea<\/code>elementos o cualquier tipo de campo en el que un usuario pueda proporcionar sus propios valores, es un lugar que siempre debe ser un objetivo de desinfecci\u00f3n.<\/p>\n<p>Afortunadamente, la API de WordPress proporciona <strong><a href=\"https:\/\/codex.wordpress.org\/Validating_Sanitizing_and_Escaping_User_Data\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una serie de funciones<\/a><\/strong> para ayudar con esto. Dependiendo de su caso de uso, es posible que deba realizar una de las siguientes acciones:<\/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>o <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/formatting.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">m\u00e1s<\/a><\/strong><\/li>\n<\/ul>\n<p>Y todo eso est\u00e1 muy bien, pero tambi\u00e9n hay formas en las que puede trabajar para desinfectar los datos utilizando las funciones proporcionadas por PHP.<\/p>\n<p>Claro, a veces las expresiones regulares son el camino a seguir pero, otras veces, es posible que desee utilizar funciones integradas en el lenguaje, m\u00e1s f\u00e1ciles de entender y de seguir.<\/p>\n<p>Cuando escribo mi propio c\u00f3digo (y cuando reviso otros) trato de tener eso en cuenta. Entonces, dicho esto, aqu\u00ed hay un proceso que puede usar que puede facilitar sus esfuerzos cuando trabaja con URL en WordPress.<\/p>\n<p>Si no est\u00e1 preparado para la discusi\u00f3n completa sobre esto, puede saltar al encabezado en la parte inferior de la publicaci\u00f3n que describe el c\u00f3digo y c\u00f3mo usarlo en su trabajo.<\/p>\n<p>Digamos que tiene un <code>input<\/code>elemento abierto y desea permitir que el usuario proporcione una URL que finalmente se representar\u00e1 en el front-end, quiz\u00e1s en un enlace, en alg\u00fan tipo de esquema o simplemente tal cual.<\/p>\n<p>Es posible ser muy agresivo y simplemente hacer algo como &quot;Si esta no es una URL v\u00e1lida, entonces no la guardes&quot;.<\/p>\n<p>Y, para ser claros, no estoy diciendo que una URL v\u00e1lida no devuelva un 404 (porque a veces existen p\u00e1ginas y a\u00f1os despu\u00e9s no lo hacen). Estoy definiendo una URL v\u00e1lida como una que est\u00e1 correctamente formateada y no incluye ninguna informaci\u00f3n superflua.<\/p>\n<p>Digamos que, por el bien de este ejemplo simple, est\u00e1 ofreciendo un campo de texto que eventualmente se guardar\u00e1 en la tabla de metadatos de la publicaci\u00f3n. Adem\u00e1s, eliminar\u00e1 todo lo que sea ilegal en una URL y dejar\u00e1 solo lo que crear\u00eda una URL v\u00e1lida.<\/p>\n<p>Para hacer eso, encuentro que las siguientes funciones son las m\u00e1s \u00fatiles:<\/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\">tira_etiquetas<\/a>. Quite las etiquetas HTML y PHP de una cadena.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.stripslashes.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tiras oblicuas<\/a>. Elimina las comillas de una cadena entrecomillada.<\/li>\n<li><a href=\"https:\/\/secure.php.net\/manual\/en\/function.filter-var.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">var_filtro<\/a>. Filtra una variable con un filtro especificado.<\/li>\n<\/ul>\n<p>Esto \u00faltimo suena un poco confuso porque se basa en la idea de que entiendes qu\u00e9 son realmente los filtros. En PHP, los filtros se pueden dividir en dos casos de uso:<\/p>\n<ol>\n<li>Validaci\u00f3n<\/li>\n<li>Desinfecci\u00f3n<\/li>\n<\/ol>\n<p>Y son esencialmente formas preconstruidas para que procesemos los datos de tal manera que los procese para determinar si es el tipo de informaci\u00f3n, generalmente una cadena o una matriz, que estamos buscando.<\/p>\n<h3>Ponerlo a trabajar<\/h3>\n<p>Con eso en mente, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/590bbb593f01fe95ce0b11106e7e86cb#file-00-saving-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed es como puede intentar<\/a><\/strong> guardar informaci\u00f3n en la base de datos sin ning\u00fan tipo de desinfecci\u00f3n (lo cual es algo malo):<\/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>Con el c\u00f3digo anterior, el usuario puede literalmente ingresar cualquier cosa en el campo y guardarlo en la base de datos. Por eso es importante la sanitizaci\u00f3n. Sin \u00e9l, el usuario puede causar estragos en la experiencia del usuario o en toda la instalaci\u00f3n de WordPress.<\/p>\n<p>Entonces, \u00bfc\u00f3mo se ve aplicar el c\u00f3digo de arriba al desinfectar las URL? En t\u00e9rminos generales, se <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/590bbb593f01fe95ce0b11106e7e86cb#file-01-serializing-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ve as\u00ed<\/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>Primero, el c\u00f3digo se ejecuta a trav\u00e9s de un filtro PHP que valida una URL. Si la cadena pasada a la funci\u00f3n de filtro ni siquiera funciona como URL, la funci\u00f3n devolver\u00e1 <code>false<\/code>.<\/p>\n<p>Si, por el contrario, funciona como una URL v\u00e1lida, entonces podemos quitar las barras que no sean necesarias. Esto significa que podemos &quot;quitar las comillas de cualquier cadena entrecomillada&quot;. M\u00e1s precisamente, esto eliminar\u00e1 la primera barra invertida consecutiva (porque, en PHP, las barras invertidas se usan para escapar de una barra invertida). \u00bfClaro? \ud83d\ude42<\/p>\n<p>Finalmente, optamos por eliminar las etiquetas porque solo queremos la URL en s\u00ed. No queremos marcas, etiquetas ni nada que pueda sabotear los datos que se escriben en la base de datos. Esto significa que si opta por ejecutar algo como:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;<\/code><\/pre>\n<p>Te quedar\u00e1s con:<\/p>\n<pre><code>\"https:\/\/tommcfarlin.com\/alert('hello world!');\"<\/code><\/pre>\n<p>Entonces, juntando todo el c\u00f3digo anterior usando esta cadena:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;'<\/code><\/pre>\n<p>Dar\u00e1 como resultado la siguiente salida:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/alert('hello world!');<\/code><\/pre>\n<p>Obviamente, esta no es una URL v\u00e1lida, pero es limpia, segura y le permite realizar cualquier otro trabajo que pueda necesitar para validar que la URL es segura para el usuario.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tres funciones que puede usar en conjunto para desinfectar correctamente las URL en WordPress antes de escribirlas en la base de datos.<\/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":[892,800,840,861],"tags":[1172],"class_list":["post-230232","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=230232"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230232\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/163470"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}