Diferencia entre esc_url () y esc_url_raw ()

9

http://core.trac.wordpress.org/browser/trunk/wp-includes/formatting.php#L2239

Estoy confundido acerca de cuándo se debe usar cualquiera de ellos.

Suponiendo que tengo esta URL: http://site.com/?getsomejavascript=1que se genera dinámicamente javascript:

  • si incluyo el script con esc_url(add_query_arg('apples', 420)), obtengo http://site.com/?getsomejavascript=1&apples=420y se rompe debido a esas #038;referencias

  • si uso esc_url_raw(add_query_arg('apples', 420))obtengo la URL correcta:http://site.com/?getsomejavascript=1&apples=420

pero en la documentación descubro que esc_url_raw solo debe usarse para escapar de las URL insertadas en la base de datos ...

Pony de un solo truco
fuente

Respuestas:

10

De la entrada del Codex para Validación de datos: URL :

esc_url( $url, (array) $protocols = null ) (desde 2.8)

Utilice siempre esc_url al desinfectar URL (en nodos de texto, nodos de atributos o en cualquier otro lugar). Rechaza las URL que no tienen uno de los protocolos incluidos en la lista blanca (por defecto a http, https, ftp, ftps, mailto, news, irc, gopher, nntp, feed y telnet), elimina los caracteres no válidos y elimina los caracteres peligrosos. En desuso desde 3.0: clean_url () Esta función codifica caracteres como entidades HTML: úsela al generar un documento (X) HTML o XML. Codifica símbolos de unión (&) y comillas simples (') como referencias de entidad numérica (&,').

esc_url_raw( $url, (array) $protocols = null ) (desde 2.8)

Para insertar una URL en la base de datos. Esta función no codifica caracteres como entidades HTML: úsela cuando almacene una URL o en otros casos donde necesite la URL no codificada. Esta funcionalidad se puede replicar en la antigua función clean_url estableciendo $ context en db.

Entonces, las principales diferencias parecen ser:

  1. esc_url()codifica entidades HTML, mientras esc_url_raw()que no
  2. esc_url()está destinado a la salida , mientras que esc_url_raw()está destinado al almacenamiento de la base de datos

EDITAR:

Dado que está codificando (o guardando / almacenando por separado) la URL real de la cadena de consulta, y luego agrega la cadena de consulta a través de [add_query_arg()][2], ¿podría ser mejor escapar de su cadena de consulta adjunta en esc_js()lugar de esc_url()?

Por ejemplo:

add_query_arg( esc_js( 'apples' ), esc_js( '420' ), $myurl )
Chip Bennett
fuente
2
ok, pero esc_url()no funciona correctamente cuando tiene argumentos de consulta en una URL que desea generar
onetrickpony
¿Qué pasa con el uso esc_js()para escapar solo de los datos agregados a través de add_query_arg()? Ver editar en respuesta, arriba.
Chip Bennett
No lo intenté, pero eso no tiene sentido :) regresarán tanto esc_js ('manzanas') como 'manzanas' apples. El problema está en add_query_arg cuando une 'manzanas' con otros argumentos con&
onetrickpony
Entonces, si los datos son confiables (es decir, estáticos), ¿por qué escapar?
Chip Bennett
No estoy completamente seguro de que sea seguro no escapar. Básicamente <script type="text/javascript" src="<?= $_SERVER['REQUEST_URI'] ?>'/?javascriptcode=1"></script>
incluyo un