Limpeza de dados: melhores práticas com exemplos de código

13

Estou tentando entender a limpeza de dados (não a validação de dados) para me ajudar a escrever temas seguros para o WordPress. Eu pesquisei na Internet tentando encontrar um guia abrangente para desenvolvedores de temas detalhando as melhores práticas. Havia alguns recursos que encontrei, inclusive a página do codex intitulada Validação de dados, embora nenhum deles fosse útil para mim. A página do códice lista as funções de higienização disponíveis, seu uso e o que elas fazem, mas não explica por que você usaria uma sobre a outra ou em que situação usaria uma função de higienização específica. O objetivo deste post é pedir a todos que contribuam com exemplos de códigos ruins / não-autorizados e como eles devem ser reescritos para sanitização adequada. Este poderia ser um código geral para limpar o título do post ou post thumnails src ou códigos mais elaborados que manipulam a sanitização de $_POST data para solicitações do Ajax.

Além disso, gostaria de saber se as funções do WordPress para adicionar / atualizar o banco de dados (por exemplo, as mencionadas no bloco de código abaixo) cuidam automaticamente do trabalho de sanitização para você? Se sim, existem exceções quando você tomaria medidas adicionais para limpar os dados enviados para essas funções do WordPress?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

Além disso, o sanitization precisa ser feito de forma diferente quando ecoando HTML em PHP em relação ao PHP inline de HTML? Para ser mais claro do que estou perguntando, aqui está o código:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

Ambas as afirmações acima alcançam a mesma coisa. Mas eles precisam ser santificados de forma diferente?

    
por John 11.04.2012 / 18:06

2 respostas

12

Esta página do códice explica isso muito bem, eu acho.

A função mais importante e mais usada é provavelmente esc_attr . Veja este exemplo:

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

Se $author_name contiver um caractere " , seu atributo será fechado e, se esse caractere for seguido por onclick="do_something();" , poderá piorar:)

Fazer print esc_attr($author_name) garante que esses caracteres sejam codificados e o navegador não faz coisas que não deve fazer.

Há um caso em que você não precisa dele: quando você está esperando um número, caso em que você pode simplesmente converter os dados de entrada para números inteiros, por exemplo:

print (int)$_POST['some_number'];

As funções meta * listadas aqui já tomam cuidado com a limpeza da entrada para o armazenamento do banco de dados, portanto, você não precisa se preocupar com isso.

O método wpdb->prepare() precisa ser usado quando você mesmo fizer as consultas do banco de dados. Aqui está um exemplo:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

As palavras-chave %s e %d serão substituídas pelos seus valores sanitizados $ _POST.

Um erro muito comum que eu vejo em muitos plugins no repositório do WP.org é passar uma consulta já preparada para ele (e mal preparada), como:

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

Não faça isso:)

  

Além disso, a higienização precisa ser feita de forma diferente ao ecoar HTML   em PHP contra PHP embutido em HTML?

     

Ambas as declarações acima   alcançar a mesma coisa. Mas eles precisam ser santificados de forma diferente?

Não.

    
por onetrickpony 11.04.2012 / 18:51
4

Este vídeo de Mark Jaquith esclareceu tudo para mim. enlace

    
por byronyasgur 18.06.2012 / 22:16