Quero garantir que todos os dados nos meus plugins / temas sejam tratados com segurança antes de entrar no banco de dados e antes de serem enviados ao navegador. Meu problema é que há situações em que a API lida com a higienização para você - como ao salvar os meta-campos de postagem - e outras onde o autor do plugin / tema é totalmente responsável por fazê-lo - como ao salvar configurações personalizadas.
Para o escopo desta pergunta, não estou preocupado em validar dados no nível do domínio - por exemplo, verificar se um campo Idade em um formulário está entre 0 e 120 ou se um endereço de email é válido. Estou preocupado apenas com segurança - por exemplo, escapar de consultas SQL para evitar a injeção de SQL ao salvar no banco de dados ou desinfetar dados que saem para modelos HTML para evitar XSS.
Para higienização de saída, eu sei que você sempre precisa usar funções como esc_html()
e esc_attr()
ao ecoar variáveis em modelos HTML. Mas e quando usar tags de modelo ? Todos eles já limpam a saída? Em caso afirmativo, para qual contexto (HTML geral, atributos de tag etc.)? Algumas funções têm variantes para diferentes contextos (como the_title_attribute()
, mas a maioria não.
Para higienização de entrada, eu sei que preciso usar $wpdb->prepare()
ao fazer consultas manuais, mas e quando usar a API de configurações para criar uma página de configurações de plug-in ou salvar os meta-campos de postagem para um tipo de postagem personalizado?
No momento, acabei de pesquisar no Core e ler os tutoriais toda vez que uso uma função para descobrir se ela higieniza ou não, mas isso é propenso a erros e consome muito tempo. Espero encontrar algum tipo de lista abrangente de todas as situações possíveis e se a API lida com isso ou não. por exemplo,
A API valida / higieniza
- Salvando meta meta com
update_postmeta()
- Salvando a meta do usuário com
update_user_meta()
- Saída de um título de postagem - use a variante contextualmente apropriada de
the_title()
- etc
Você precisa validar / higienizar manualmente
- Salvando opções de plug-in com a API de configurações. Passe um retorno de chamada como o terceiro parâmetro de
register_setting()
. - Consultas diretas ao banco de dados: envolva a consulta
$wpdb->prepare()
. - Saída de variáveis em HTML. Use
esc_attr()
,esc_html()
, etc - etc
Também estaria interessado em entender por que a API a fornece em determinadas situações, mas não em outras. Suponho que tenha algo a ver com a natureza desconhecida dos dados, mas gostaria de ouvir uma explicação completa.
the_title()
, the_permalink()
etc), você estará bem, mas com dados personalizados, não (por exemplo get_post_meta()
). Em caso de dúvida, higienize a si mesmo - não pode machucar.