Parece que fuera de la caja, no hay diferencia
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 );
}
La única diferencia entre las 2 funciones es el filtro aplicado al final. WordPress no agrega nada a estos filtros, por lo que en una instalación estándar de WP no funcionan. Se proporcionan en el caso límite de que alguien pueda necesitarlos.
Preguntas y respuestas rápidas
Entonces, ¿por defecto son idénticos?
¡Si! Las funciones esc_attr
y esc_html
tienen la misma implementación
¿Son idénticos los filtros?
La única diferencia es que tienen nombres diferentes, funcionan de la misma manera, se usan de la misma manera y ninguno de los filtros se usa en el núcleo.
¿Los filtros hacen algo?
¡No! Todo el escape se realiza en la función cuando wp_check_invalid_utf8
y _wp_specialchars
se llama.
Los filtros no escapan, son una oportunidad para que los complementos realicen verificaciones y procesamientos adicionales.
¿Hay casos límite?
Solo si usa los filtros, digamos que se conectó esc_html
pero no attribute_escape
, o viceversa. Para una instalación WP estándar, las 2 funciones son idénticas, sin diferencia.
¿Por qué attribute_escape
y no esc_attr
?
Compatibilidad al revés. Solía haber una attribute_escape
función, que ahora está marcada como obsoleta después de que esc_
se agregaron las funciones de estilo.
¿Por qué usaría estos filtros?
¯\_(ツ)_/¯
Esta sería una situación rara. Algunas personas pueden abusar de él de la misma manera que se abusa de las API de traducción para buscar texto de reemplazo. Esto ya es una mala práctica, ya que esos filtros se llaman mucho, una pequeña pérdida de velocidad se magnifica miles de veces
Pero tenga en cuenta que si no tiene cuidado, puede comprometer la seguridad de estas funciones deshaciendo el escape que agregaron o agregando contenido no escapado al final. Por eso los filtros son peligrosos.
¿Debo preocuparme por esto?
No. Solo debe preocuparse si ha utilizado esos filtros, que por sí mismos deberían haber activado alarmas rojas masivas de que algo en su desarrollo salió muy mal.
Las funciones esc_attr
y esc_html
son seguras de usar, y escapar de contenido. Tiene la obligación ética y moral de usarlos si valora la seguridad de su código
¿Esto significa que debería usar esc_html
?
No, escapar se trata de establecer expectativas. Si espera un atributo, use esc_attr
. El hecho de que sea funcionalmente el mismo en este momento no significa que eso no cambie en el futuro con un lanzamiento de seguridad