¿Por qué debería usar esc_url?
Esto hace que mi código sea más difícil. El codex de WordPress explica el uso de esc_url hablando vagamente sobre seguridad. Pero, ¿realmente vale la pena la molestia?
Por ejemplo, ¿cuál es el beneficio práctico importante de seguridad al usar
<?php echo esc_url( home_url( '/' ) ); ?>
en lugar de
<?php echo home_url() ?>
PD: No estoy hablando sobre desarrollo de temas, sino sobre un sitio específico.

Si revisas la documentación sobre Validación de Datos, tiene lo siguiente que decir acerca de la función:
Siempre usa esc_url cuando sanitices URLs (en nodos de texto, nodos de atributo o en cualquier otro lugar). Rechaza URLs que no tengan uno de los protocolos permitidos [...], elimina caracteres inválidos y remueve caracteres peligrosos.
Ahí lo tienes — un beneficio de seguridad práctico. Protocolo válido, sin caracteres sospechosos.
La respuesta sobre la necesidad es firmemente sí. Escapar la salida es la práctica de seguridad más básica.

Con todo respeto, no veo cómo el enlace de inicio, por ejemplo, puede representar un riesgo de seguridad. ¿Quizás estas pautas son para la creación de temas y no se aplican a código "privado"? Después de todo, puede ser mejor codificar manualmente la dirección de inicio y otros enlaces en HTML y no usar PHP en absoluto si existen riesgos de seguridad.

Es mucho más productivo aplicar prácticas de seguridad de manera consistente y universal, que debatir si cada caso en particular vale la pena. :)

Por otro lado, un recurso sugerido por el Codex establece Regla N°3: Confía en WordPress. Esto parece recomendar en contra de sobresanear funciones principales de wp como home_url()
, si se usan en su contexto adecuado. Según esta recomendación, esperaría que home_url
realizara su propio saneamiento.

Lo siento, soy bastante nuevo en este tema, pero ¿alguien podría dar un ejemplo donde home_url() o quizás get_permalink() (que por lo que sé también debería usarse con esc_url()) devuelva una URL inválida o no saneada? No quiero ser vago o terco, por lo que un ejemplo podría ayudarme a entender el uso.

Otras cosas que debes tener en cuenta sobre
esc_url()
es que se usa para algo como <a href="SANITIZAR_ESTA_URL">tu_texto</a>
. Si vas a usar la URL en tu salida HTML, como un atributo href para un enlace, o un atributo src para un elemento de imagen, debes usar esc_url()
.
esc_url_raw()
es para otros casos donde quieres una URL limpia, pero no quieres que las entidades HTML sean codificadas. Por lo tanto, cualquier uso no HTML (base de datos, redirecciones) usaría esta función.
La función esc_url_raw()
hará prácticamente lo mismo que esc_url()
, pero no decodificará entidades, lo que significa que no reemplazará & con & y así sucesivamente. Como señaló Mark, es seguro usar esc_url_raw()
en consultas de bases de datos, redirecciones y funciones HTTP, como `wp_remote_get()'
para más información sobre esc_url_raw()

bueno, toda entrada de usuario debe ser saneada... Si la URL que inyectas no es entrada de usuario (por ejemplo, configuración del sitio por alguien en quien confías plenamente, valores codificados directamente) entonces puedes prescindir de esc_url.
pero si pudiera inyectar esa URL en tu sitio, fácilmente podría inyectar código JS, código de redirección... o incluso código del lado del servidor en algunas situaciones.
esto puede llevar a secuestro de sesiones y cuentas de tus usuarios siendo robadas, entre otras malas opciones.
Edición:
En tu ejemplo esc_url( home_url( '/' ) );
¡operó sobre un valor semi-codificado directamente! por lo tanto, esc_url
puede eliminarse.
Dicho esto, todavía no veo por qué molestarse en hacer distinciones entre cuándo hay una amenaza y cuándo no, y en general sugeriría mantener esc_url() para cada valor.

esc_url se utiliza para generar un HTML válido (no para sanitizar entradas). Debes usar esta función cada vez que no estés 100% seguro de que lo que quieres mostrar es un HTML válido para ese contexto.
