As funções mais utilizadas no WordPress para validação de dados

1
Funções WordPress para validação de dados

As funções WordPress para validação de dados são diversas e utilizadas pelo próprio core para garantir maior segurança e integridade dos dados no input e output.

Essas mesmas funções podem, e devem, ser utilizadas pelos desenvolvedores de temas e plugins. Caso contrário, e com absoluta certeza, seu projeto estará vulnerável a SQL Injection, XSS e vários outros tipos de ataques.

Assim como o WordPress, o PHP também possui suas próprias funções para validação de dados. E no contexto da plataforma, há funções equivalentes com especificidades.

Há dois anos atrás escrevi neste blog sobre o assunto falando porque a validação de dados é importante para a segurança no WordPress.

Transcrevo abaixo quatro pontos essenciais para você considerar:

  1. Não confie nos usuários e nos dados que lhe são entregues;
  2. Seu código além de funcional precisa ser seguro;
  3. Valide dados de entrada (input) e dados de saída (output);
  4. Faça uso das funções nativas do WordPress para validação de dados.

As funções WordPress para validação de dados

São dezenas de funções WordPress para validação de dados, cada uma focada em um tipo de validação, você vai se inteirando do assunto e dando importância a questão e por conseguinte utilizando mais funções para validar os dados.

No entanto, há três funções que você precisa começar adotar a partir de hoje em todos os seus projetos de desenvolvimento de temas e plugins.

Você deve também, retomar os projetos antigos e aplicar essas funções. O uso é simples e a segurança agregada é muito considerável.

As três principais funções

  1. esc_html();
  2. esc_attr();
  3. esc_url().

Antes de compreender cada uma delas com mais detalhes é preciso entender algumas questões simples e relevantes.

Essas funções começam com “esc_”. A abreviação “esc” vem de “escape” que significa “escapar”. Se consultarmos o dicionário fica ainda mais claro a intenção “livrar-se de situação perigosa, dolorosa, desagradável”.

Elas retornam os dados recebidos através do seu parâmetro, portanto, é preciso considerar a função echo para exibir os dados tratados por essas funções.

Além disso, todas elas estão disponíveis somente a partir da versão 2.8 do WordPress. Essas mesmas funções podem ser utilizadas para o input ou output de dados.

Considerando essas três funções WordPress para validação de dados, vamos escapar, ficar livres, códigos HTML, códigos inválidos para atributos de tags HTML e URLs.

A função esc_html() do WordPress

Para ficar simples e claro o entendimento de uso da função esc_html() considere o seguinte cenário ERRADO.

<h3><?php echo $var_title; ?></h3>

No exemplo de código acima, estamos mostrando um valor contido numa variável para ser o valor englobado pelas tags H3.

Essa variável, antes de ser exibida, deve ser escapada para exibir com segurança o seu valor e evitar ataques XSS. Nesse cenário que entra a função esc_html(), assim:

<h3><?php echo esc_html( $var_title ); ?></h3>

A função esc_html() vai codificar os caracteres < (menor que) > (maior que) & (E comercial) ” (aspas duplas) e ‘ (aspas simples).

Além disso ela aplica no valor recebido o filtro “esc_html” no dado retornado.

A função esc_attr() do WordPress

A função esc_attr() é bem parecida e em muita das vezes confundida com a esc_html(). O macete para diferenciar é que attr é uma abreviação de attribute, ou seja, atributo.

Essa função WordPress é indicada para validar dados de atributos de tags HTML.

Considerando o mesmo exemplo anterior, imagine o seguinte cenário ERRADO.

<h3 class="<?php echo $var_class_name; ?>"><?php echo esc_html( $var_title ); ?></h3>

O valor da variável $var_class_name deve ser escapada, caso contrário o código será passível de ataques XSS. E a aplicação de uso da função é simples, observe:

<h3 class="<?php echo esc_attr( $var_class_name ); ?>"><?php echo esc_html( $var_title ); ?></h3>

A função esc_attr() vai codificar os caracteres < (menor que) > (maior que) & (E comercial) ” (aspas duplas) e ‘ (aspas simples).

A diferença entre a esc_html() é que ela aplica no valor recebido o filtro “attribute_escape” no valor retornado, ao contrário do filtro “esc_html”.

A função esc_url() do WordPress

A primeira informação relevante é que a função esc_url() substituiu a função clean_url() que ficou em desuso.

Ela não precisa ser utilizada em conjunto com a esc_attr() quando URL for esperado como valor de um atributo, ou com a esc_html() quando URL for esperado como texto.

Essa função recebe três parâmetros ao contrário das outras duas que recebem somente um. No entanto, somente o primeiro é requerido, que neste caso é a URL em si.

URLs devem ser escapadas sempre para garantir sua integridade, seja quando ela for utilizada como texto, atributo de tag HTML ou qualquer outra aplicação.

Exemplos práticos de seu uso seria:

<p><?php echo esc_url( $var_url ); ?></p>

<a href="<?php echo esc_url( home_url( '/' ) ); ?>">Página inicial</a>

Um exemplo prático de ataque XSS

Ataques do tipo XSS é recorrente e boa parte deles acontecem por falta de escapamento de dados.

Imagine o seguinte cenário: você exibe na tela o valor de uma variável contida em parâmetro de URL. Esse valor é público, fácil de ser manipulado e pode conter um código HTML/JavaScript malicioso.

O código malicioso quando exibido na tela é processado pelo navegador de internet. Imagine que esse código aplique um redirecionamento e leve o usuário para um site infectado ou com prática de pishing para roubo de senhas ou dados diversos.

<p>Resultado da sua busca por <?php echo $_GET['s']; ?></p>

No parâmetro da URL, ao contrário de conter um termo de busca, poderia ter algo assim:

site.com/?s=<script>CÓDIGO JS DE REDIRECIONAMENTO</script>

E com isso o código seria aplicado ao DOM, processado pelo navegador de internet e redirecionado ao usuário para o destino malicioso desejado.

Esse tipo de ataque é muito comum, assim como a correção. Basta escapar o dados contidos no parâmetro “s”, por exemplo com o uso da função esc_html().

Considerando esse exemplo de busca, o WordPress tem uma função específica, a get_search_query() e the_search_query(). Elas utilizam internamente as funções de escape.

Conclusão

É muito comum desenvolvedores não se atentarem com a questão de segurança, seja por desconhecimento ou preguiça mesmo.

O uso das funções aqui apresentadas deixarão os códigos dos seus temas e plugins mais seguros, livres de XSS. Lembre-se que códigos além de funcional devem ser seguros.