2010-01-13 10 views
5

Il mio problema è il seguente. Ho un XHTML 1.1 pagina che ha una forma e di input campi. Uno dei campi di input contiene un valore che è un URI. Questo URI contiene coppie di valori-chiave con commerciale (&) come separatore argomentazione, che verrà passato come una richiesta GET da un'altra applicazione web nel browser.How-to XHTML 1.1 convalida una e commerciale senza fuggirla?

Di solito vorrei utilizzare l'entità & per creare gli e commerciali per convalidare il codice come XHTML 1.1. Il mio problema è che l'applicazione non riceve la richiesta GET, dal momento che (come previsto) il browser non capisce come gestire & nella URI.

Quindi la mia domanda è davvero come scrivere una e commerciale senza utilizzare l'entità HTML, quindi il browser lo riconosce ancora come separatore di argomenti e la richiesta GET viene passata correttamente all'app web.

Ho provato Hex (% 26) per codificare la e commerciale, ma il browser non lo "traduce" di nuovo in un carattere corretto &.

Una questione collegata, ma non fornisce la risposta esatta alla domanda che mi chiedo:

XHTML and & (Ampersand) encoding

+2

"(come previsto) il browser non capisce come gestire' '& nel URI" - che è ** non ** come previsto, è non dovrebbe vedere '&' nella barra degli indirizzi a meno che non sia stato codificato in doppia. –

+0

Rileggi la domanda. Gli e commerciali sono parte di un URI contenuto nel campo del valore di un input. Dopo che il modulo è stato inviato, l'utente verrà riportato nella stessa posizione, esattamente come è scritto. Ciò significa che o lascio gli ampersands non codificati ma non riesco a convalidarli, oppure li codifico con il problema che il browser riceverà l'entità HTML nella barra degli indirizzi e non riuscirà a passare la stringa di query all'app successiva nel processo. –

+1

Il browser dovrebbe decodificare '&' in '&' quando si converte l'HTML in un DOM. Dovrebbe quindi codificare '&' come '% 26' quando si costruisce l'URL o i dati codificati in forma x-url. Se non funziona, ho il sospetto che tu stia gestendo i dati in modo errato sul server. – Quentin

risposta

0

non ho potuto preoccuparsi di spendere più tempo su questo.Ho semplicemente cambiato il separatore argomento di includere anche punto e virgola (;) in modo da poter usare al posto di commerciale:

#cat .htaccess 
php_value arg_separator.input "&;" 
1

Non v'è alcun modo per includere un carattere commerciale in un valore di attributo senza l'utilizzo di un soggetto.

Non c'è modo di includere un carattere di e commerciale come un textNode senza utilizzare un'entità o marcatori CDATA (ma scommetto che stai servendo come testo/html quindi non puoi usarli).

Detto questo - qualsiasi browser che non riesce a decodificare l'entità è rotto. Nessun browser tradizionale fallisce lì. Stai utilizzando un browser oscuro o danneggiato o stai diagnosticando male il problema.

+0

Qualsiasi browser principale (IE o FF lo faranno). Il browser gestisce la decodifica correttamente all'interno dell'HTML. Mi riferisco all'utilizzo effettivo dell'entità HTML nella barra degli indirizzi. Provalo ... –

+2

Beh, non farlo! Digiti URL semplici nella barra degli indirizzi, non URL con codifica HTML. È come aprire un documento di Microsoft Word nel Blocco note. – Quentin

+0

Il browser viene reindirizzato a quell'URI poiché è stato digitato direttamente nella barra degli indirizzi, incluse le entità HTML. Questo è il mio problema –

0

Senza il codice è difficile dire dove si sta cercando di conservare queste informazioni, se si potesse pubblicare il codice potremmo fare un lavoro migliore per capire il problema.

Una possibile (se questo è in realtà quello che si è di fronte) è quello di spostare gli elementi nella querystring in altri elementi del modulo, come ad esempio:

<form action="example.com/?foo=1&bar=2> 
    <!-- ... --> 
</form> 

a:

<form action="example.com"> 
    <input type="hidden" name="foo" value="1" /> 
    <input type="hidden" name="bar" value="2" /> 
    <!-- ... --> 
</form> 
+0

La querystring non è nell'azione della forma effettiva, ma all'interno del campo del valore di un campo di input.È un valore che viene passato a un'app Web, che in seguito restituisce il browser dell'utente allo stesso URI (con la stringa della query in esso). Questo è dove fallisce poiché il browser non può capire l'entità HTML nella barra degli indirizzi. –

+0

Gotcha, mio ​​male. Se questo è il caso, non puoi scappare semplicemente quando lo infili nel campo di input (che probabilmente è meglio fare comunque per evitare eventuali attacchi XSS) e quindi sfuggire prima di eseguire il reindirizzamento sul lato server? – mynameiscoffey

+0

Sfortunatamente il reindirizzamento viene da una terza parte. Quindi ho bisogno di inviare l'URI esattamente come ne ho bisogno per tornare ... la terza parte lo riceve semplicemente e ritorna al browser dell'utente dopo che ha fatto altro lavoro. –

1

Come di cui l'altra questione si fa riferimento, il browser converte il &amp; al & quando la pagina viene elaborato, in modo che il "&" (non &amp;) devono essere inviate al server nella richiesta GET. Forse stai usando Ajax per fare la richiesta GET, nel qual caso potresti aver bisogno di decodificare l'HTML. L'entità è richiesta per XHTML - nessuna codifica alternativa, basta assicurarsi che sia decodificata correttamente.

Riferimento: The & changes to &amp; in a hyperlink

+0

Il problema è che il browser riceve l'entità HTML direttamente nella barra degli indirizzi (come se fosse stata digitata direttamente). Non mi riferisco alla decodifica che avviene automaticamente, ad es. se si utilizza la e commerciale entità equivalente all'interno di un ancoraggio. –

+0

Come viene inserito l'URI nel campo di input? Se il valore fa parte dell'HTML, dovrebbe essere il nome dell'entità, se impostato utilizzando JavaScript, quindi non dovrebbe. –

1

Il sfuggito & dovrebbe essere convertito dal client (browser) in tutto il documento XHTML.

Così si dovrebbe fuggire ogni & con &amp;