2010-10-25 15 views
180

Ho un menu a discesa in una pagina Web che si interrompe quando la stringa del valore contiene una citazione.Come evitare correttamente le virgolette all'interno degli attributi html?

Il valore è "asd ma nel DOM appare sempre come una stringa vuota.

Ho provato in tutti i modi che conosco per sfuggire alla stringa correttamente ma inutilmente.

<option value=""asd">test</option> 
<option value="\"asd">test</option> 
<option value="&quot;asd">test</option> 
<option value="&#34;asd">test</option> 

Qualche idea su come eseguire il rendering sulla pagina in modo che il messaggio di postback contenga il valore corretto?

+0

Come stai generando la pagina? – SLaks

+1

Cosa succede se si utilizzano le virgolette singole?

+4

Devo sottolineare che nessuna di queste risposte dice come eseguire correttamente l'escape delle stringhe per l'uso all'interno degli attributi html – reconbot

risposta

250

&quot; è il modo corretto, il terzo dei vostri test:

<option value="&quot;asd">test</option> 

si può vedere questo lavoro in un esempio jsFiddle here. In alternativa, è possibile delimitare il valore di attributo con apici:

<option value='"asd'>test</option> 
+15

La quarta opzione dell'OP, ", è anche un modo valido per evitare le virgolette. ecco un vantaggio nell'uso di entità html numeriche su entità con nome, in quelle entità nominate non coprono tutti i caratteri, mentre le entità numeriche lo fanno. L'elenco completo di HTML4 è http://www.w3.org/TR/html4/sgml/entities.html. – atk

+27

@atk: sì, '"' esegue il mapping allo stesso carattere di '"', ma non c'è alcun vantaggio di utilizzare l'opzione numerica qui perché '"' è un'entità con nome definito. '"' è anche più facile da ricordare. –

+5

Sono d'accordo. In questo caso particolare, è più facile usare ". Intendevo solo sottolineare il caso generale. – atk

1

Si dovrebbe consentire solo i dati non attendibili in una whitelist di buoni attributi come: allineare, alink, alt, bgcolor, confine, cellpadding, cellspacing, di classe, colore, cols, colspan, coords, dir, face, height, hspace, ismap, lang, marginheight, marginwidth, multiple, nohref, noresize, noshade, nowrap, ref, rel, rev, rows, rowspan, scrolling, shape, span, riepilogo, tabindex, titolo, usemap, valign, value, vlink, vspace, width

Si vuole davvero mantenere i dati non attendibili dai gestori javascript oltre agli attributi id o name (possono clobber altri elementi nel DOM).

Inoltre, se si inseriscono dati non attendibili in un attributo SRC o HREF, allora è davvero un URL non affidabile, quindi è necessario convalidare l'URL, assicurarsi che NON sia un javascript: URL e quindi codifica di entità HTML.

Maggiori dettagli su tutti c'è qui: https://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet

+3

So che questo è in ritardo, ma quasi tutti questi attributi sono deprecati in HTML4.01 e rimossi in 5. Potrebbe non avere importanza in ogni caso, dal momento che ci sono modi migliori per proteggersi, basta indicarlo. – trysis

+0

La domanda è chiedere informazioni con i caratteri di citazione – Quentin

4

Un'altra opzione sta sostituendo le doppie virgolette con le virgolette singole, se non ti dispiace qualunque essa sia. Ma io non menziono questo:

<option value='"asd'>test</option> 

Dico questo uno:

<option value="'asd">test</option> 

Nel mio caso ho usato questa soluzione.

+8

Ma se il valore contiene virgolette singole e doppie, fallisce – Raptor

+0

@Raptor Ho detto se il valore contiene virgolette doppie, convertirle in virgolette singole.Se il valore contiene virgolette singole, allora non ci sono problemi – csonuryilmaz

8

Se si utilizza PHP, provare a chiamare la funzione htmlentities o htmlspecialchars.

+6

Ci sono problemi con queste funzioni: http : //wonko.com/post/html-escaping –

4

Per HTML syntax, e anche HTML5, i seguenti sono tutte le opzioni valide:

<option value="&quot;asd">test</option> 
<option value="&#34;asd">test</option> 
<option value='"asd'>test</option> 
<option value='&quot;asd'>test</option> 
<option value='&#34;asd'>test</option> 
<option value=&quot;asd>test</option> 
<option value=&#34;asd>test</option> 

Si noti che se si utilizza XML syntax sono necessarie le virgolette (singole o doppie).

Here's a jsfiddle showing all of the above working.

Problemi correlati