Na verdade, sou um engenheiro da VIP que faz muita revisão de código :) Eu sinalizo muitas falhas de escape.
mas não escapa à saída
Não é bem assim, não escapa à saída, o que é surpreendente para a maioria das pessoas. Isso ocorre porque, se você é um superadministrador, tem a unfiltered_html
capacidade, portanto não pode escapar na saída. Em vez disso, ele é executado wp_kses_post
na entrada. Idealmente, você removeria essa capacidade.
Aqui está a implementação no momento atual:
function the_content( $more_link_text = null, $strip_teaser = false ) {
$content = get_the_content( $more_link_text, $strip_teaser );
/**
* Filters the post content.
*
* @since 0.71
*
* @param string $content Content of the current post.
*/
$content = apply_filters( 'the_content', $content );
$content = str_replace( ']]>', ']]>', $content );
echo $content;
}
O mecanismo ideal para escapar de qualquer coisa que passe pelo the_content
filtro, por outro lado, é:
echo apply_filters( 'the_content', wp_kses_post( $content ) );
Dessa forma, tornamos o conteúdo seguro e, em seguida, o executamos pelo filtro, evitando que as incorporações etc. sejam removidas.
So Why Escape
O ponto de fuga é gerar HTML válido, a segurança adicional que ele fornece é apenas um bom efeito colateral.
Para impedir que os usuários quebrem acidentalmente a marcação
Há muitas razões para escapar, mas, fundamentalmente, você está reforçando as expectativas. Pegue o seguinte código:
<a href="<?=$url?>">
Esperamos $url
conter um URL adequado para um href
atributo, mas e se não for? Bem, por que deixá-lo ao acaso, vamos aplicá-lo:
<a href="<?=esc_url( $url )?>">
Agora sempre será um URL. Não importa se um hacker coloca uma imagem $url
ou se um usuário digita no campo errado ou se há um script malicioso. Sempre será um URL válido, porque dissemos que será um URL. Claro que pode ser um URL muito estranho, mas sempre atenderá às expectativas de que um URL esteja lá. Isso é muito útil, seja para validação de marcação, segurança, etc.
Dito isto, escapar não é validação, escapar não é sanitização. Essas são etapas separadas que acontecem em diferentes pontos do ciclo de vida. Escapar obriga as coisas a atender às expectativas, mesmo que isso as consiga.
Às vezes eu gosto de pensar em fugir como uma daquelas mostras de jogos japonesas com a parede gigante de espuma com o recorte. Os participantes precisam se encaixar na forma do cão ou são descartados, apenas para nossos propósitos existem lasers e facas ao redor do buraco. O que sobrar no final terá a forma de um cachorro, e será implacável e rigoroso se você ainda não tiver a forma de um cachorro.
Lembrar:
- higienizar cedo
- validar cedo
- escapar tarde
- escapar frequentemente
A segurança é uma etapa múltipla, cebola de múltiplas camadas de defesas, escapar é uma das camadas externas de defesa na saída. Ele pode alterar o código de ataque em um site comprometido, tornando-o inútil, impedir explorações abertas e garantir que seu cliente não interrompa um site colocando tags em um campo que não deveria. Não é um substituto para as outras coisas, e é de longe a ferramenta de segurança mais subutilizada em um manual para desenvolvedores.
Quanto ao porquê de escapar se the_content
não? Se você tem uma inundação e 5 buracos na parede, mas apenas tempo para consertar 3, você encolhe os ombros e não conserta nenhum? Ou você reduz o risco e reduz a área de ataque?
Talvez eu possa ajudar a consertar os dois furos finais com este trecho:
add_filter( 'the_content' function( $content ) {
return wp_kses_post( $content );
}, PHP_INT_MAX + 1 );
Aqui, definimos a prioridade para o número mais alto possível no PHP e adicionamos 1 para que ele transborde para o número mais baixo possível que pode ser representado. Dessa forma, todas as chamadas para the_content
escaparão do valor antes de qualquer outro filtro. Dessa forma, as incorporações etc ainda funcionam, mas os usuários não podem se infiltrar em HTML perigoso através do banco de dados. Além disso, procure remover o unfiltered_html
recurso de todas as funções
wp_kses_post