¿Cuál es la diferencia entre el filtro esc_html y el filtro attribute_escape?

8

¿Cuál es la diferencia exacta entre esc_htmly attribute_escapefiltro?

esc_html()usos esc_html filtery esc_attr()usos attribute_escape filter. Ambos codifican <> & "'(menor que, mayor que, ampersand, comillas dobles, comillas simples).

Me interesa saber qué los hace diferentes en términos de seguridad (escape).

djadmin
fuente
bueno, si no fueran diferentes, no sería necesario tenerlos a los dos ... la pregunta IMO simplemente no está clara, es como preguntar cuál es la diferencia entre los filtros de contenido y extracto
Mark Kaplun,
1
Creo que eso es lo que está preguntando, ¿cómo son diferentes y por qué?
Tom J Nowell
@TomJNowell, bueno, uno está llamado para escapar de los atributos y el otro para escapar del HTML general. Eso explica el por qué, y principalmente explica también el cómo;) ¿Dónde debería comenzar una respuesta aquí, explicando la diferencia entre los caracteres permitidos en los atributos y el html general? esto suena un poco demasiado básico (pero podría ser lo que pregunta el OP, supongo)
Mark Kaplun
2
Eso sería bueno, pero un ejemplo de algo esc_attrque se escapa y que esc_htmlno es útil, después de todo, ¿por qué no usarlo en esc_htmltodas partes? Si es obvio para usted, puede no parecer una buena pregunta, pero no es obvio para el que pregunta cómo difieren estas 2 funciones dado que ambas escapan de los personajes esperados
Tom J Nowell

Respuestas:

8

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_attry esc_htmltienen 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_utf8y _wp_specialcharsse 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_htmlpero no attribute_escape, o viceversa. Para una instalación WP estándar, las 2 funciones son idénticas, sin diferencia.

¿Por qué attribute_escapey no esc_attr?

Compatibilidad al revés. Solía ​​haber una attribute_escapefunció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_attry esc_htmlson 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

Tom J Nowell
fuente
Gracias por la respuesta. Tal vez necesito reformular mi pregunta. Estoy más interesado en saber si hay alguna diferencia en la implementación principal de los dos filtros mencionados anteriormente. Esto realmente nos ayudaría (a los desarrolladores) a saber cómo funciona el escape en atributos y HTML.
djadmin
Core no utiliza esos filtros, se proporcionan para complementos si surge la necesidad. Sin embargo, recomiendo encarecidamente no usarlos por razones de seguridad
Tom J Nowell
"Los filtros esc_html y attribute_escape son, por lo tanto, muy peligrosos". Realmente no entiendo este punto. Si no usamos esto, ¿cómo se supone que debemos escapar de las entradas del usuario para evitar XSS?
djadmin
Como dijiste, pasan a través de un filtro antes de salir. Mi pregunta original es cómo son estos dos filtros diferentes en términos de implementación. Creo que habría algún caso límite en el que el esc_htmlfiltro se escape y el attribute_escapefiltro no, o viceversa.
djadmin
Ellos no. Los filtros se proporcionan para código de terceros y Core no los utiliza. Core no se engancha en los filtros, ni hace nada con ellos. Esos casos extremos tendrían que ser escritos por un desarrollador de temas o complementos, en ese momento sería obvio ya que usted sería la persona que lo escribió
Tom J Nowell