2012-04-17 9 views
10

Cosa si dovrebbe fare contro il contenuto dell'attributo href: codifica HTML o URL?come codificare l'attributo href in HTML

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

Da un lato, poiché l'attributo href contiene URL, è necessario utilizzare la codifica URL. D'altra parte, sto inserendo questo URL in HTML, quindi deve essere codificato in HTML.

Per favore aiutami a superare questa contraddizione.

Grazie.


EDIT:

Ecco la contraddizione. Supponiamo che ci possano essere i caratteri "<" e ">" nell'URL. La codifica dell'URL non li sfuggirà, quindi ci saranno caratteri HTML riservati all'interno dell'attributo href, che viola lo standard. La codifica HTML sfuggirà ai caratteri '<' e '>' e l'HTML sarà valido, ma dopo di ciò ci saranno caratteri '&' inattesi nell'URL (questo è un carattere riservato per l'URL, è usato come delimitatore dei parametri della stringa di query) .

Reserved URL characters forma un superset di reserved HTML characters ad eccezione di "<" e ">" riservati per HTML ma non per URL.


EDIT 2:

mi sono sbagliato di personaggi '<' e '>', sono in realtà per cento sfuggito dalla codifica URL. Se è così, la codifica dell'URL è sufficiente in questo caso, non è vero?

+1

Hai provato qualcosa di così lontano? –

+2

Questo meme "hai provato qualcosa" sta diventando sciocco. Che cosa con il recupero degli errori del browser, gran parte della codifica dei dati è di proteggere da problemi di sicurezza. Come dovresti dirti di aver ragione se stai provando qualcosa? Supponi che qualunque suite di test di sicurezza tu abbia una copertura sufficiente? Questa è una domanda perfettamente ragionevole su una tecnica fondamentale. – Quentin

+0

Quentin ha più o meno ragione, ma la domanda rimane, quali situazioni possono essere contraddittorie? Puoi mostrare un esempio? E hai provato entrambe le soluzioni e hanno entrambi funzionato, o entrambi non funzionano? –

risposta

10

Costruisci un URL come di consueto. Segui le regole per la costruzione di URL. Codifica i dati che hai inserito.

Quindi costruire HTML come di consueto. Segui le regole per la costruzione di HTML. Codifica i dati mentre lo inserisci.

, ad esempio entrambi (ma nell'ordine corretto).

Non si escludono a vicenda, quindi non c'è contraddizione.

Per esempio (questo è un esempio semplificato che assume i dati in $ _GET è corretta ed esiste, non farlo nel mondo reale):

$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

Grazie, Quentin, ho capito il tuo punto. Ma non sono abbastanza sicuro di due cose. 1) Cosa accadrebbe se htmlspecialchars() in realtà codificasse qualcosa? Se è così, ci sarebbero "&" caratteri all'interno dell'URL, che non è permesso. 2) È possibile che la codifica dell'URL lasci alcuni caratteri HTML riservati dopo se stessa? Penso che non lo sia. –

+0

Non ci sarebbe '&' all'interno dell'URL. Ci sarebbe '&' dentro l'HTML. L'HTML verrebbe analizzato e il carattere '&' apparirà nel DOM. Se copi/incolli il sorgente HTML dell'attributo in un browser, questo si interromperà, ma non dovresti farlo. Si interromperà anche se hai archiviato l'URL in un file di testo, lo hai gzip, quindi copi/incollato il contenuto binario del file compresso nella barra degli indirizzi. – Quentin

+0

Non ricordo l'elenco di caratteri che sono/non sono codificati in URL fuori dalla mia testa. Certamente gli URL possono includere caratteri (come '&') che hanno un significato speciale in HTML (e che non dovrebbero essere codificati in url se si desidera che abbiano il loro significato speciale nell'URL, come nell'esempio che ho dato). – Quentin