Risposte:
Non ho i privilegi di commento, o avrei lasciato questo come un commento su una risposta precedente.
NON, ripeto, NON sfuggire a un apostrofo in HTML usando
'
Questo non è un riferimento di entità carattere HTML valido. È un riferimento all'entità carattere XML. Mentre Firefox e Chrome, almeno, renderanno quanto sopra come apostrofo in un documento HTML, Internet Explorer no. E sta seguendo lo standard quando si rifiuta di farlo.
Puoi sfuggire a un apostrofo in HTML usando
'
Ma non credo sia, in generale, necessario.
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
Non sono d'accordo con Nate. Idealmente, dovresti usare il minor numero di escape possibile e utilizzare UTF-8 per esprimere i caratteri in modo nativo. Per fare ciò è necessario un editor in grado di gestire UTF-8 e una dichiarazione set di caratteri corretta, come ad esempio:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Tuttavia, dovresti prendere l'abitudine di sfuggire ai caratteri che hanno un significato speciale in (X) HTML, vale a dire:
< <
> >
" "
& &
' '
Questo farà in modo di non scrivere accidentalmente markup quando si desidera scrivere questi caratteri. Ciò è particolarmente importante per l'input dell'utente, per mantenere la sicurezza. È meno ovvio, ma in realtà è importante scappare "
. Se una stringa finisce in un attributo HTML ( title="something"
ecc.) L'utente può terminare l'attributo e inserire il proprio markup. Immagina cosa succede se l'utente entra " onclick="alert('hello');
e lo inseriscititle="..."
Se stai usando PHP, puoi usare la htmlspecialchars
funzione per farlo. Altre lingue possono avere altre funzioni simili.
Aggiornamento: resto corretto sul problema di Apos. Maledetto fastidioso IE.
'
non usare '
. Se, per qualsiasi motivo, usi virgolette singole per un attributo HTML come title='something'
te, ovviamente devi scappare da virgolette singole all'interno del valore dell'attributo.
Dipende dal tuo caso d'uso, ma probabilmente dovremmo essere scoraggiati dall'uso '
in linguaggio naturale in generale, quindi il problema non dovrebbe sorgere a meno che tu non abbia il codice del computer nel tuo XML.
Laddove abbiamo tradotto le stringhe, scopriamo che alcuni traduttori sostituiscono le virgolette di chiusura con le virgolette ricci unicode, ma lasciano le virgolette diritte come virgolette iniziali, lasciandole visivamente sbilanciate e dall'aspetto poco professionale.
I caratteri unicode ‘
e ’
dovrebbero sostituire '
ove possibile, tanto quanto “
e ”
dovrebbero sostituire "
. Questo è utile perché i computer non riconoscono la punteggiatura riccia come speciale. (Anche se mi diverto vedere che Stack Overflow / Chrome considera ' don’t
' un errore di ortografia, mentre è soddisfatto di ' don't
'.)
Non aiuta che abbiamo le molto allettanti '
e "
caratteri a destra sulla tastiera.
Quindi vediamo se StackExchange stesso codifica un apostrofo usando un'entità HTML.
Ecco alcuni esempi dal codice sorgente di questa pagina.
(1) Titolo della domanda: codificato.
Should I escape the Apostrophe ( ' ) character with its HTML entity (&#39;)?
(2) Risposta di Drew: non codificato.
But I don't believe it is, in general, necessary.
(3) Commento di Tom sulla risposta di nitro2k01: codificato.
I've got two contradicting answers now. One recommends escaping ' and the other does not. What should I believe?
Quindi va in entrambe le direzioni.
Tuttavia, il codice sorgente di questa pagina non utilizza mai '
. Tutte le codifiche sono nella forma '
. Ciò è coerente con nitro2k01 e il consiglio di Drew di non utilizzare '
.
La tua risposta dipende dal contesto:
Se stai scrivendo un paragrafo in HTML con questi dati, potrebbe essere sufficiente sfuggire a <,> e &:
<p>{string}</p>
Se stai scrivendo in un attributo HTML, però, mi piace
<a href='/some/path/{string}'>...</a>
Quindi dovresti assolutamente sfuggire all'apostrofo. Questo può essere un vettore di attacco se un attaccante lo inserisce per string
:
string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
La stessa cosa vale per le doppie virgolette. Ho anche letto che il backtick `è vulnerabile, dal momento che potrebbe essere usato anche per gli attributi HTML. Se non si dispone di uno script di controllo automatico della sintassi HTML come parte delle routine di distribuzione, si supponga che uno di questi tre possa essere utilizzato e che debba essere sottoposto a escape per gli attributi HTML.
Al limite, anche gli attributi non quotati sono validi, quindi anche il personaggio spaziale avrebbe bisogno di scappare. E !
, @
, $
, %
, (
, )
, =
, +
, {
, }
, [
, e ]
, ognuno dei quali può uscire da un attributo e consentire l'inserimento di una nuova.
Per eseguire l'escaping in JavaScript, utilizzo JQuery $(element).text(string)
o $(element).attr(attrname, string)
per eseguire l'escaping per me. Fai molta attenzione $(element).html(unsafe)
, che non sfugge al tuo HTML!
Sul codice lato server, devo valutare attentamente il rischio per ciascun caso e leggere attentamente la documentazione. Questo dipenderà dal particolare linguaggio e dalle librerie che stai utilizzando, come Rails, Django, PHP grezzo, Drupal, ecc.
Se stai pensando di interrompere il problema il prima possibile, prima ancora che entri nel tuo database, tieni i tuoi cavalli. L'escape HTML del testo memorizzato nel tuo DB può portarti a fare un giro infernale. Che cosa succede se in seguito desideri consentire determinati tag HTML, ma non altri, come corsivo, grassetto, colori e tabelle? Cosa succede se ti sei perso qualcosa nel tuo primo passaggio, ma la tua fuga è già sfuggita &
come &
e "
come "
? Li trasformerà in &amp;
e &quot;
?
Il mio approccio è quello di eseguire l'escaping SQL solo per il database, ma lasciare tutti i caratteri speciali HTML per l'elaborazione successiva. In questo modo, posso eseguire il debug e ottimizzare facilmente le mie fughe HTML. Mente, ciò significa anche che non posso fidarmi delle mie tabelle SQL se hanno stringhe fornite dall'utente.
Non fidarti mai degli input controllati dall'utente e cita sempre i tuoi attributi HTML!
Basato su: Esiste più escape HTML rispetto a &, <,> e " di Ryan Grove
Se il tuo apostrofo appartiene al contenuto, scappa. Tutti gli altri caratteri di contenuto che possono essere confusi con il codice, scappano.
Il modo più semplice per fare il lavoro senza usare l'entità reale è usare PHP htmlentities()
o htmlspecialchars()
funzioni:
$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
$val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'>
<head>
<meta http-equiv='Content-type' content='text/html;charset=utf-8' />
<title>Special Characters</title>
<style type='text/css'>
@import 'special.css';
</style>
</head>
<body>
<form method='post' action='' id='fm' name='fm'>
<input type='text' value='$val' name='val' id='val' />
<input type='submit' value='submit' name='sub' id='sub' />
</form>
</body>
<script type='text/javascript' src='special.js'></script>
</html>";
&apos
essere ora valido per HTML5. Detto questo, se devi supportare i browser legacy o scrivere e-mail HTML per Outlook, allora ti'
conviene attenersi se ritieni necessario sfuggire al personaggio.