¿Cuál es la diferencia entre esc_html, esc_attr, esc_html_e y similares?
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?
esc_html()
escapa una cadena para que no sea interpretada como HTML. Caracteres como <
se convierten en <
, 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.

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

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.

_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.
