{"id":230630,"date":"2022-12-01T16:05:00","date_gmt":"2022-12-01T13:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230630"},"modified":"2022-11-09T23:17:05","modified_gmt":"2022-11-09T20:17:05","slug":"higienizando-urls-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/higienizando-urls-no-wordpress\/","title":{"rendered":"Higienizando URLs no WordPress"},"content":{"rendered":"\n<p>Trabalhar com campos centrados no usu\u00e1rio no WordPress \u2013 como <code>input<\/code>elementos, <code>textarea<\/code>elementos ou qualquer tipo de campo em que um usu\u00e1rio possa fornecer seus pr\u00f3prios valores \u00e9 um local que deve sempre ser alvo de sanitiza\u00e7\u00e3o.<\/p>\n<p>Felizmente, a API do WordPress fornece <strong><a href=\"https:\/\/codex.wordpress.org\/Validating_Sanitizing_and_Escaping_User_Data\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">v\u00e1rias fun\u00e7\u00f5es<\/a><\/strong> para ajudar nisso. Dependendo do seu caso de uso, pode ser necess\u00e1rio seguir um destes procedimentos:<\/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\">sanitizar_texto_campo<\/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\">sanitizar_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\">mais<\/a><\/strong><\/li>\n<\/ul>\n<p>E tudo isso \u00e9 muito bom, mas tamb\u00e9m existem maneiras pelas quais voc\u00ea pode trabalhar para limpar os dados usando fun\u00e7\u00f5es fornecidas pelo PHP.<\/p>\n<p>Claro, \u00e0s vezes as express\u00f5es regulares s\u00e3o o caminho a seguir, mas, outras vezes, voc\u00ea pode querer usar recursos que est\u00e3o embutidos na linguagem, mais f\u00e1ceis de entender e mais f\u00e1ceis de seguir.<\/p>\n<p>Ao escrever meu pr\u00f3prio c\u00f3digo (e ao revisar outros), tento manter isso em mente. Ent\u00e3o, com isso dito, aqui est\u00e1 um processo que voc\u00ea pode usar que pode facilitar seus esfor\u00e7os ao trabalhar com URLs no WordPress.<\/p>\n<p>Se voc\u00ea n\u00e3o estiver pronto para a discuss\u00e3o completa sobre isso, voc\u00ea pode pular para o t\u00edtulo na parte inferior da postagem que descreve o c\u00f3digo e como us\u00e1-lo em seu trabalho.<\/p>\n<p>Digamos que voc\u00ea tenha um <code>input<\/code>elemento aberto e queira permitir que o usu\u00e1rio forne\u00e7a uma URL que eventualmente ser\u00e1 renderizada no front-end, talvez em um link, em algum tipo de esquema ou simplesmente como est\u00e1.<\/p>\n<p>\u00c9 poss\u00edvel ser realmente agressivo e simplesmente fazer algo como &#8220;Se este n\u00e3o for um URL v\u00e1lido, n\u00e3o o salve&quot;.<\/p>\n<p>E, para ser claro, n\u00e3o estou dizendo que uma URL v\u00e1lida n\u00e3o retorna um 404 (porque \u00e0s vezes as p\u00e1ginas existem e anos depois elas n\u00e3o). Estou definindo um URL v\u00e1lido como aquele que est\u00e1 formatado corretamente e n\u00e3o inclui nenhuma informa\u00e7\u00e3o estranha.<\/p>\n<p>Ent\u00e3o, digamos, para este exemplo simples, voc\u00ea est\u00e1 oferecendo um campo de texto que eventualmente ser\u00e1 salvo na tabela de metadados de postagem. Al\u00e9m disso, voc\u00ea eliminar\u00e1 tudo o que for ilegal em uma URL e deixar\u00e1 apenas o que criaria uma URL v\u00e1lida.<\/p>\n<p>Para fazer isso, acho as seguintes fun\u00e7\u00f5es mais \u00fateis:<\/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>. Retire as tags HTML e PHP de uma string.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.stripslashes.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tiras barras<\/a>. Retira as aspas de uma string entre aspas.<\/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>. Filtra uma vari\u00e1vel com um filtro especificado.<\/li>\n<\/ul>\n<p>O \u00faltimo parece um pouco confuso porque se baseia na ideia de que voc\u00ea entende o que os filtros realmente s\u00e3o. No PHP, os filtros podem ser divididos em dois casos de uso:<\/p>\n<ol>\n<li>Valida\u00e7\u00e3o<\/li>\n<li>Sanitiza\u00e7\u00e3o<\/li>\n<\/ol>\n<p>E eles s\u00e3o essencialmente formas pr\u00e9-constru\u00eddas para processarmos dados de tal forma que processe dados para determinar se \u00e9 o tipo de informa\u00e7\u00e3o, geralmente uma string ou uma matriz, que estamos procurando.<\/p>\n<h3>Colocando para funcionar<\/h3>\n<p>Com isso em mente, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/590bbb593f01fe95ce0b11106e7e86cb#file-00-saving-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">veja como voc\u00ea pode tentar<\/a><\/strong> salvar informa\u00e7\u00f5es no banco de dados sem nenhum tipo de higieniza\u00e7\u00e3o (o que \u00e9 ruim):<\/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>Com o c\u00f3digo acima, o usu\u00e1rio pode literalmente inserir qualquer coisa no campo e salv\u00e1-lo no banco de dados. Por isso a higieniza\u00e7\u00e3o \u00e9 importante. Sem ele, o usu\u00e1rio pode causar estragos na experi\u00eancia do usu\u00e1rio ou em toda a instala\u00e7\u00e3o do WordPress.<\/p>\n<p>Ent\u00e3o, como \u00e9 aplicar o c\u00f3digo acima ao limpar URLs? De um modo geral, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/590bbb593f01fe95ce0b11106e7e86cb#file-01-serializing-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fica assim<\/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>Primeiro, o c\u00f3digo \u00e9 executado por meio de um filtro PHP que valida uma URL. Se a string passada para a fun\u00e7\u00e3o de filtro nem funcionar como URL, a fun\u00e7\u00e3o retornar\u00e1 <code>false<\/code>.<\/p>\n<p>Se, por outro lado, funcionar como um URL v\u00e1lido, podemos remover quaisquer barras que n\u00e3o sejam necess\u00e1rias. Isso significa que podemos &#8220;tirar as aspas de qualquer string entre aspas&#8221;. Mais precisamente, isso remover\u00e1 a primeira barra invertida consecutiva (porque, no PHP, as barras invertidas s\u00e3o usadas para escapar de uma barra invertida). Claro? \ud83d\ude42<\/p>\n<p>Por fim, optamos por remover as tags porque queremos apenas a pr\u00f3pria URL. N\u00e3o queremos nenhuma marca\u00e7\u00e3o, tags ou qualquer coisa que possa sabotar os dados que est\u00e3o sendo gravados no banco de dados. Isso significa que, se voc\u00ea optar por executar 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>Voc\u00ea ficar\u00e1 com:<\/p>\n<pre><code>\"https:\/\/tommcfarlin.com\/alert('hello world!');\"<\/code><\/pre>\n<p>Ent\u00e3o, juntando todo o c\u00f3digo acima usando esta string:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;'<\/code><\/pre>\n<p>Resultar\u00e1 na seguinte sa\u00edda:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/alert('hello world!');<\/code><\/pre>\n<p>Obviamente, essa n\u00e3o \u00e9 uma URL v\u00e1lida, mas \u00e9 limpa, segura e permite que voc\u00ea execute qualquer outro trabalho necess\u00e1rio para validar que a URL \u00e9 segura para o usu\u00e1rio.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tr\u00eas fun\u00e7\u00f5es que voc\u00ea pode usar em conjunto umas com as outras para higienizar corretamente as URLs no WordPress antes de grav\u00e1-las no banco de dados.<\/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":[898,806,846,867],"tags":[1170],"class_list":["post-230630","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-php-8","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230630","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=230630"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230630\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/163470"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230630"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230630"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}