¿Cuál es la diferencia entre esc_html, esc_attr, esc_html_e, y así sucesivamente?

12

Recibí comentarios del encargado de seguridad y él señaló que debería usar el escape apropiado de la entrada del usuario en mi código. Así que investigué un poco y encontré funciones de escape.

¿Cual es la diferencia entre ellos? ¿Cuándo debo usar esc_html()y cuándo esc_attr()? ¿Y cuándo debo usar estas funciones _e()al final?

Baldrick
fuente
1
¿Has leído la documentación ?
Jacob Peattie
2
Sí, y eso me confundió aún más :(
baldrick

Respuestas:

19

esc_html()escapa a una cadena para que no se analice como HTML. Caracteres como <se convierten &lt;, por ejemplo. Esto se verá igual para el lector, pero significa que si el valor que se genera es <script>el navegador no lo interpretará como una etiqueta de script real.

Utilice esta función siempre que el valor que se envíe no contenga HTML.

esc_attr()escapa a una cadena para que sea segura de usar en un atributo HTML, como class=""por ejemplo. Esto evita que un valor salga del atributo HTML. Por ejemplo, si el valor es "><script>alert();</script>y trató de generarlo en un atributo HTML, cerraría la etiqueta HTML actual y abriría una etiqueta de script. Esto no es seguro. Al escapar del valor, no podrá cerrar el atributo HTML y etiquetar y generar HTML inseguro.

Utilice esta función al generar un valor dentro de un atributo HTML.

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

Utilice esta función al generar un valor dentro de un atributo href=""o src="".

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

Use esta función al generar un valor dentro de un <textarea>elemento.

esc_html()y esc_attr()también tienen versiones que terminan en __(), _e()y _x(). Estos son para la producción de cadenas traducibles.

WordPress tiene funciones __(), _e()y _x(), para la salida de texto que puede ser traducido. __() devuelve una cadena traducible, _e() repite una cadena traducible y _x()devuelve una cadena traducible con un contexto dado. Probablemente los hayas visto antes.

Dado que no puede confiar necesariamente en que un archivo de traducción contenga valores seguros, el uso de estas funciones al generar una cadena traducible garantiza que las cadenas que se emiten no puedan causar el mismo problema descrito anteriormente.

Use estas funciones cuando envíe cadenas traducibles.

Jacob Peattie
fuente
2
Tenga en cuenta que, de manera predeterminada, no hay diferencia entre esc_htmly esc_attr, se usa el mismo código (solo tienen un filtro diferente sin usar): wordpress.stackexchange.com/questions/264698/…
baptx
4

esc_htmlse usaría dentro de html, por ejemplo, entre una <p>etiqueta

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

esc_attr se usaría para escapar de valores de atributos en etiquetas html de esta manera:

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

aplicar _eal final es para usarlo con dominios de texto y lo repetirá automáticamente, por ejemplo:

<p><?php esc_html_e( 'some-text', 'text-domain' ); ?></p>

<p my-attribute="<?php esc_attr_e( 'some-text', 'text-domain' ); ?>"></p>

Además de _eque también hay lo __que hace lo mismo _epero no hace eco para que pueda almacenarlo en una variable.

jrmd
fuente
2
_eno es solo para hacer eco, 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 es usarlo mal.
Jacob Peattie
@JacobPeattie mi mal, voy a actualizar ... EDITAR Fijo
jrmd