2012-04-17 20 views
10

¿Qué se debe hacer contra el contenido del atributo href: HTML o codificación URL?cómo codificar el atributo href en HTML

<a href="???">link text</a> 

Por un lado, como el atributo href contiene el URL, debería usar la codificación URL. Por otro lado, estoy insertando esta URL en HTML, por lo que debe estar codificada en HTML.

Ayúdame a superar esta contradicción.

Gracias.


EDIT:

Aquí está la contradicción. Supongamos que puede haber los caracteres '<' y '>' en la URL. La codificación URL no se les escapará, por lo que habrá caracteres HTML reservados dentro del atributo href, que viola el estándar. La codificación HTML escapará a '<' y '>' caracteres y HTML será válido, pero después de eso habrá caracteres '&' inesperados en la URL (este es un carácter reservado para URL, se usa como un delimitador de parámetros de cadena de consulta) .

Reserved URL characters forma un superconjunto de reserved HTML characters excepto el '<' y '>' que están reservados para HTML pero no para la URL.


EDIT 2:

que estaba equivocado acerca de los personajes '<' y '>', en realidad son ciento escapado por la codificación URL. Si es así, la codificación URL es suficiente en este caso, ¿no es así?

+1

Ha intentado nada hasta ahora? –

+2

Este meme "has probado todo" se está poniendo tonto. Con la recuperación de errores del navegador, una gran parte de la codificación de datos es para proteger contra los problemas de seguridad. ¿Cómo se supone que debes decir que lo hiciste bien si estás intentando algo? ¿Asume que cualquier suite de pruebas de seguridad que tenga tenga suficiente cobertura? Esta es una pregunta perfectamente razonable sobre una técnica fundamental. – Quentin

+0

Quentin tiene más o menos razón, pero la pregunta sigue siendo, ¿qué situaciones pueden ser contradictorias? ¿Puedes mostrar un ejemplo? ¿Y probaron ambas soluciones y ambas funcionaron, o ambas no funcionaron? –

Respuesta

10

Construya una URL de forma normal. Sigue las reglas para construir URLs. Codifica los datos que pones en él.

Luego construye HTML como siempre. Sigue las reglas para construir HTML. Codifica los datos tal como los pones en él.

es decir Haga ambas cosas (pero en el orden correcto).

No son mutuamente excluyentes, por lo que no hay contradicción.

Por ejemplo (este es un ejemplo simplificado que asume los datos en $ _GET es correcta y existe, no lo haga en el mundo real):

$search_term = $_GET['q']; 
$page = $_GET['page']; 
$next_page = $page + 1; 
$next_page_url = 'http://example.com/search?q=' . urlencode($search_term) . '&page=' . urlencode($page); 
$html = '<a href="' . htmlspecialchars($next_page_url) . '">link text</a>'; 
+0

Gracias, Quentin, tengo tu punto. Pero no estoy seguro de dos cosas. 1) ¿Qué pasaría si htmlspecialchars() realmente codificara algo? Si es así, habría caracteres '&' dentro de la URL, lo cual no está permitido. 2) ¿Es posible que la codificación URL deje algunos caracteres HTML reservados después de sí mismo? Creo que no es así. –

+0

No habría '&' dentro de la URL. Habría '&' dentro del HTML. El HTML se analizaría y el carácter '&' aparecería en el DOM. Si copia/pega la fuente HTML del atributo en un navegador, se romperá, pero no debería hacer eso. También se rompería si almacenara la URL en un archivo de texto, lo descomprimiera gf, luego copie/pegue el contenido binario del archivo comprimido en la barra de direcciones. – Quentin

+0

No recuerdo la lista de caracteres que están/no están codificados en las URL en la parte superior de mi cabeza. Ciertamente, las URL pueden incluir caracteres (como '&') que tienen un significado especial en HTML (y que no deben ser urlencoded si desea que tengan su significado especial en la URL, según el ejemplo que proporcioné). – Quentin

Cuestiones relacionadas