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_attr
e esc_html
tê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_utf8
e _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_html
mas não attribute_escape
ou vice-versa. Para uma instalação padrão do WP, as 2 funções são idênticas, sem diferença.
Por que attribute_escape
e não esc_attr
?
Compatibilidade com versões anteriores. Costumava haver uma attribute_escape
funçã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_attr
e esc_html
sã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