Devo sfuggire al personaggio Apostrophe (') con la sua entità HTML (& # 39;)?


38

Quali personaggi devono essere salvati con le loro entità HTML. Ad esempio, &è scappato con &.

Dovrebbe 'essere evitato con '?

Risposte:


41

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


Riconosco che questo sarebbe stato corretto quando è stato pubblicato, tuttavia guardando l'articolo di Wikipedia sembra &aposessere 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.
tomhughes,

24

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:

< &lt;
> &gt;
" &quot;
& &amp;
' &#39;

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 htmlspecialcharsfunzione per farlo. Altre lingue possono avere altre funzioni simili.

Aggiornamento: resto corretto sul problema di Apos. Maledetto fastidioso IE.


Ho due risposte contraddittorie ora. Uno consiglia di scappare "e l'altro no. Cosa dovrei credere?
Tom,

7
In breve. È possibile o meno sfuggire a propria discrezione. Se lo fai, &#39;non usare &apos;. 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.
nitro2k01,

il tuo secondo paragrafo è ciò che è importante per me, il mio disturbo ossessivo compulsivo è entrato in azione quando ho visto errori di testo rossi nel mio git commit a causa di apostrofi senza escape imgur.com/a/LN0Pu89
eballeste

6

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.


1

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 ( &#39; ) character with its HTML entity (&amp;#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&#39;ve got two contradicting answers now. One recommends escaping &#39; 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 &apos;. Tutte le codifiche sono nella forma &#39;. Ciò è coerente con nitro2k01 e il consiglio di Drew di non utilizzare &apos;.


1
Sebbene in tutti e 3 i casi non debba essere codificato in HTML.
MrWhite,

1

Dove sta andando quella stringa?

La tua risposta dipende dal contesto:

  1. Se stai scrivendo un paragrafo in HTML con questi dati, potrebbe essere sufficiente sfuggire a <,> e &:

    <p>{string}</p>

  2. 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='"
  1. 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.

  2. 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.

Quello che faccio

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.

Banche dati

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 &amp;e "come &quot;? Li trasformerà in &amp;amp;e &amp;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.

Morale

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


-1

Se il tuo apostrofo appartiene al contenuto, scappa. Tutti gli altri caratteri di contenuto che possono essere confusi con il codice, scappano.


"Se il tuo apostrofo appartiene al contenuto, scappa." - Ciò sembrerebbe errato (come se mancasse la parola "non"). Se l'apostrofo fa parte del contenuto, non sfuggirlo: non dovrebbe essere necessario.
MrWhite,

-4

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>";

4
È uno scherzo?
Su '17

@Su 'Temo che non sia ...
William Edwards,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.