Qual é a diferença entre filtro esc_html e filtro attribute_escape?

8

Qual é a diferença exata entre esc_htmle attribute_escapefilter?

esc_html()usos esc_html filtere esc_attr()usos attribute_escape filter. Ambos codificam <> & "'(menor que, maior que, comercial, aspas duplas, aspas simples).

Estou interessado em saber o que exatamente os torna diferentes em termos de segurança (escapando).

djadmin
fonte
bem, se eles não fossem diferentes, não haveria necessidade de ter os dois ... a questão da IMO não é clara, é como perguntar qual é a diferença entre os filtros the_content e the_excerpt
Mark Kaplun
1
Eu acho que é isso que ele está perguntando, como eles são diferentes e por quê?
Tom J Nowell
@ TomJNowell, bem, um é chamado para escapar de atributos e o outro para escapar do HTML geral. Isso explica o porquê e explica principalmente como também;) Onde uma resposta deve começar aqui, explicando a diferença entre os caracteres permitidos nos atributos e no html geral? isso soa um pouco muito básicos (mas pode ser o que o OP pergunta sobre eu acho)
Mark Kaplun
2
Isso seria bom, mas um exemplo de algo esc_attrque esc_htmlnão serve seria útil, afinal, por que não usar em esc_htmltodos os lugares? Se é óbvio para você pode não parecer uma boa pergunta, mas não é óbvio para o consulente como essas 2 funções são diferentes dado que ambos escapar os caracteres esperados
Tom J Nowell

Respostas:

8

Parece que fora da caixa, não há diferença

function esc_html( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in HTML.
     *
     * Text passed to esc_html() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.8.0
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'esc_html', $safe_text, $text );
}
function esc_attr( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in an HTML attribute.
     *
     * Text passed to esc_attr() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.0.6
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'attribute_escape', $safe_text, $text );
}

A única diferença entre as 2 funções é o filtro aplicado no final. O WordPress não adiciona nada a esses filtros; portanto, em uma instalação padrão do WP, eles não são operacionais. Eles são fornecidos no caso extremo de que alguém possa precisar deles.

Perguntas e Respostas Rápidas

Então, por padrão, eles são idênticos?

Sim! As funções esc_attre esc_htmltêm a mesma implementação

Os filtros são idênticos?

A única diferença é que eles têm nomes diferentes, funcionam da mesma maneira, são usados ​​da mesma maneira e nenhum filtro é usado no núcleo.

Os filtros fazem alguma coisa?

Não! Todo o escape é feito na função quando wp_check_invalid_utf8e _wp_specialcharsé chamado.

Os filtros não escapam, são uma oportunidade para os plug-ins fazerem verificações e processamento adicionais.

Existem casos extremos?

Somente se você usar os filtros, diga que está conectado, esc_htmlmas não attribute_escapeou vice-versa. Para uma instalação padrão do WP, as 2 funções são idênticas, sem diferença.

Por que attribute_escapee não esc_attr?

Compatibilidade com versões anteriores. Costumava haver uma attribute_escapefunção, que agora é marcada como obsoleta após a esc_adição das funções de estilo.

Por que eu usaria esses filtros?

¯\_(ツ)_/¯isso seria uma situação rara. Algumas pessoas podem abusar da mesma forma que as APIs de tradução são abusadas para pesquisar substituir texto. Isso já é uma prática ruim, pois esses filtros são chamados muito, uma pequena perda de velocidade é ampliada milhares de vezes

Mas considere que, se você não for cuidadoso, poderá comprometer a segurança dessas funções, desfazendo o escape adicionado por elas ou adicionando conteúdo sem escape no final. Por esse motivo, os filtros são perigosos.

Preciso me preocupar com isso?

Não. Você só precisa se preocupar se tiver usado esses filtros, que por si só deveriam ter acionado grandes alarmes vermelhos de que algo em seu desenvolvimento deu muito errado.

As funções esc_attre esc_htmlsão seguras de usar e escapam do conteúdo. Você tem uma obrigação ética e moral de usá-los se valorizar a segurança do seu código

Isso significa que eu deveria usar esc_html?

Não, fugir é definir expectativas. Se você está esperando um atributo, use esc_attr. Só porque é funcionalmente o mesmo no momento, não significa que não mudará no futuro com uma versão de segurança

Tom J Nowell
fonte
Obrigado pela resposta. Talvez eu precise reformular minha pergunta. Estou mais interessado em saber se há alguma diferença na implementação principal dos dois filtros mencionados acima. Isso realmente nos ajudaria (desenvolvedores) a saber como o escape funciona em atributos e HTML.
djadmin
Esses filtros não são usados ​​pelo Core, são fornecidos para plugins, se necessário. Eu recomendo fortemente contra o uso delas, no entanto, por razões de segurança
Tom J Nowell
"Os filtros esc_html e attribute_escape são, portanto, muito perigosos." Eu realmente não entendo esse ponto. Se não usarmos isso, como devemos escapar das entradas do usuário para impedir o XSS?
djadmin
Como você disse, eles passam por um filtro antes de sair. Minha pergunta original é como esses dois filtros são diferentes em termos de implementação. Eu acredito que haveria algum caso extremo que esc_htmlescape de attribute_escapefiltro e filtro não ou vice-versa.
djadmin
Eles não. Os filtros são fornecidos para código de terceiros e não são usados ​​pelo Core. O núcleo não se prende aos filtros, nem faz nada com eles. Esses casos extremos teriam de ser escrito por um tema ou plugin desenvolvedor, altura em que seria óbvio como você seria a pessoa que o escreveu
Tom J Nowell