¿Cuál es la diferencia entre esc_html, esc_attr, esc_html_e y similares?

7 dic 2018, 17:59:49
Vistas: 33.7K
Votos: 23

Recibí comentarios de un experto en seguridad y señaló que debería usar un escape apropiado para las entradas de usuario en mi código. Así que hice algunas investigaciones y encontré funciones de escape.

¿Cuál es la diferencia entre ellas? ¿Cuándo debería usar esc_html() y cuándo esc_attr()? ¿Y cuándo debería usar estas funciones con _e() al final?

2
Comentarios

¿Has leído la documentación?

Jacob Peattie Jacob Peattie
7 dic 2018 18:06:35

Sí, y eso me confundió aún más :(

baldrick baldrick
7 dic 2018 18:10:46
Todas las respuestas a la pregunta 2
1
49

esc_html() escapa una cadena para que no sea interpretada como HTML. Caracteres como < se convierten en &lt;, por ejemplo. Esto se verá igual para el lector, pero significa que si el valor que se está mostrando es <script>, no será interpretado por el navegador como una etiqueta de script real.

Usa esta función cuando el valor que se muestra no debe contener HTML.

esc_attr() escapa una cadena para que sea segura de usar en un atributo HTML, como class="", por ejemplo. Esto evita que un valor rompa el atributo HTML. Por ejemplo, si el valor es "><script>alert();</script> e intentas mostrarlo en un atributo HTML, cerraría la etiqueta HTML actual y abriría una etiqueta de script. Esto es inseguro. Al escapar el valor, no podrá cerrar el atributo HTML ni la etiqueta, evitando la salida de HTML inseguro.

Usa esta función cuando muestres un valor dentro de un atributo HTML.

esc_url() escapa una cadena para asegurarse de que sea una URL válida.

Usa esta función cuando muestres un valor dentro de un atributo href="" o src="".

esc_textarea() escapa un valor para que sea seguro de usar en un elemento <textarea>. Al escapar un valor con esta función, se evita que un valor mostrado dentro de un <textarea> cierre el elemento y muestre su propio HTML.

Usa esta función cuando muestres un valor dentro de un elemento <textarea>.

esc_html() y esc_attr() también tienen versiones que terminan en __(), _e() y _x(). Estas son para mostrar cadenas traducibles.

WordPress tiene funciones, __(), _e() y _x(), para mostrar texto que puede ser traducido. __() devuelve una cadena traducible, _e() imprime una cadena traducible, y _x() devuelve una cadena traducible con un contexto dado. Probablemente las hayas visto antes.

Dado que no necesariamente puedes confiar en que un archivo de traducción contenga valores seguros, usar estas funciones al mostrar una cadena traducible asegura que las cadenas mostradas no puedan causar los mismos problemas descritos anteriormente.

Usa estas funciones cuando muestres cadenas traducibles.

7 dic 2018 18:28:01
Comentarios

Ten en cuenta que, por defecto, no hay diferencia entre esc_html y esc_attr, se utiliza el mismo código (solo tienen un filtro diferente que no se usa): https://wordpress.stackexchange.com/questions/264698/what-is-the-difference-between-esc-html-filter-vs-attribute-escape-filter/264707#264707

baptx baptx
20 jul 2019 13:11:42
2
10

esc_html se utilizaría dentro de HTML, por ejemplo entre una etiqueta <p>:

<p><?php echo esc_html( $some_variable ); ?></p>

esc_attr se usaría para escapar valores de atributos en etiquetas HTML así:

<p my-attribute="<?php echo esc_attr( $some_variable ); ?>"></p>

Aplicar _e al final es para usarlo con dominios de texto y automáticamente lo imprimirá por ti, por ejemplo:

<p><?php esc_html_e( 'algún-texto', 'text-domain' ); ?></p>

<p my-attribute="<?php esc_attr_e( 'algún-texto', 'text-domain' ); ?>"></p>

Además de _e, también está __ que hace lo mismo que _e pero no lo imprime, por lo que puedes almacenarlo en una variable.

7 dic 2018 18:04:13
Comentarios

_e no es solo para imprimir, es para localización. Por lo tanto, solo debe usarse cuando se pasa una cadena a la función y debe incluir un dominio de texto. Tu último ejemplo lo está usando incorrectamente.

Jacob Peattie Jacob Peattie
7 dic 2018 18:12:24

@JacobPeattie mi error, lo actualizaré... EDITADO Corregido

jrmd jrmd
7 dic 2018 18:23:18