it-swarm.it

Quali caratteri potrebbero essere sfuggiti in HTML?

Sono uguali a XML, forse più lo spazio ( )?

Ho trovato alcuni elenchi enormi di caratteri di escape HTML, ma non penso che debba essere scappato. Voglio sapere che necessita di essere sfuggito.

208
Ahmet

Se stai inserendo contenuti di testo nel tuo documento in una posizione in cui è previsto il contenuto del testo1, in genere devi solo sfuggire agli stessi caratteri come faresti in XML . All'interno di un elemento, questo include solo l'entità escape ampersand & e il delimitatore di elemento minore di e maggiore di segni <>:

& becomes &amp;
< becomes &lt;
> becomes &gt;

All'interno dei valori degli attributi devi anche sfuggire al carattere di citazione che stai utilizzando:

" becomes &quot;
' becomes &#39;

In alcuni casi può essere sicuro saltare la fuga di alcuni di questi personaggi, ma ti incoraggio a scappare tutti e cinque in tutti i casi per ridurre la possibilità di commettere un errore.

Se la codifica del documento non supporta tutti i caratteri che stai utilizzando, ad esempio se stai cercando di usare emoji in un documento con codifica ASCII, devi anche sfuggire a quelli. La maggior parte dei documenti in questi giorni sono codificati utilizzando la codifica UTF-8 completamente Unicode, laddove ciò non sarà necessario.

In generale, non dovresti uscire dagli spazi come &nbsp;. &nbsp; non è uno spazio normale, è uno spazio non-breaking . È possibile utilizzare questi spazi al posto di quelli normali per impedire che un'interruzione di riga venga inserita tra due parole o per inserire uno spazio aggiuntivo senza che venga automaticamente compresso, ma in genere si tratta di un caso raro. Non farlo a meno che tu non abbia un vincolo di progettazione che lo richiede.


1 Con "un luogo in cui è previsto il contenuto del testo", intendo all'interno di un elemento o il valore di un attributo quotato in cui si applicano le normali regole di analisi. Ad esempio: <p>HERE</p> o <p title="HERE">...</p>. Quello che ho scritto sopra non si applica al contenuto che ha regole di parsing o significato speciali, come all'interno di uno script o tag di stile, o come un nome di elemento o attributo. Ad esempio: <NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, <style>NOT-HERE</script> o <p NOT-HERE="...">...</p>.

In questi contesti, le regole sono più complicate ed è molto più facile introdurre una vulnerabilità di sicurezza. Ti sconsiglio vivamente di non inserire mai contenuti dinamici in nessuna di queste posizioni. Ho visto team di sviluppatori competenti per la sicurezza di introdurre vulnerabilità assumendo che avessero codificato questi valori correttamente, ma manca una custodia Edge. Di solito c'è un'alternativa più sicura, come mettere il valore dinamico in un attributo e poi gestirlo con JavaScript.

Se è necessario, si prega di leggere le regole di prevenzione XSS del progetto Open Web Application Security per aiutare a comprendere alcune delle preoccupazioni che è necessario tenere a mente.

250
Jeremy

Dipende dal contesto. Alcuni possibili contesti in HTML:

  • corpo del documento
  • dentro attributi comuni
  • all'interno dei tag script
  • all'interno di tag di stile
  • molti altri!

Vedere OWASP's Cheat Sheet Prevenzione script di cross-site , in particolare il " Perché non posso solo l'entità HTML codificare i dati non attendibili ? "and" Regole di Prevenzione XSS ". Tuttavia, è meglio leggere l'intero documento.

20
daxelrod

Fondamentalmente, ci sono tre caratteri principali che dovrebbero essere sempre sfuggiti nei tuoi file HTML e XML, in modo che non interagiscano con il resto dei markup, così come probabilmente ti aspetti, due di loro saranno i wrapper di sintassi, che sono <>, sono elencati come di seguito:

 1)  &lt; (<)

 2)  &gt; (>)

 3)  &amp; (&)

Inoltre potremmo usare double-quote (") as" e la citazione singola (') come & apos

Evita di inserire contenuti dinamici in <script> e <style>. Queste regole non sono applicabili per loro. Ad esempio, se devi includere JSON in a, sostituisci <con\x3c, il carattere U + 2028 con\u2028 e U + 2029 con\u2029 dopo la serializzazione JSON.)

Caratteri di escape HTML: elenco completo: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

Quindi devi scappare <, o & quando seguito da qualsiasi cosa possa iniziare un riferimento di carattere. Anche la regola sulla e commerciale è l'unica regola per gli attributi quotati, poiché la virgoletta corrispondente è l'unica cosa che ne risolverà una. Ma se non vuoi terminare il valore dell'attributo lì, sfuggi alle virgolette.

Cambiare in UTF-8 significa ri-salvare il tuo file:

L'uso della codifica dei caratteri UTF-8 per la tua pagina significa che puoi evitare la maggior parte degli escape e lavorare solo con i personaggi. Si noti, tuttavia, che per modificare la codifica del proprio documento, non è sufficiente modificare semplicemente la dichiarazione di codifica nella parte superiore della pagina o sul server. È necessario ri-salvare il documento in quella codifica. Per informazioni su come farlo, leggere la codifica delle impostazioni nelle applicazioni di creazione di siti Web.

Caratteri invisibili o ambigui:

Un ruolo particolarmente utile per le fughe consiste nel rappresentare personaggi invisibili o ambigui nella presentazione.

Un esempio potrebbe essere il carattere Unicode U + 200F RIGHT-TO-LEFT MARK. Questo carattere può essere usato per chiarire la direzionalità nel testo bidirezionale (ad esempio quando si usano gli script in arabo o in ebraico). Tuttavia non ha una forma grafica, quindi è difficile vedere dove questi caratteri si trovano nel testo e, se vengono persi o dimenticati, potrebbero creare risultati imprevisti durante le modifiche successive. Usare (o il suo equivalente numerico di riferimento ai caratteri) invece rende molto facile individuare questi personaggi.

Un esempio di carattere ambiguo è U + 00A0 NO-BREAK SPACE. Questo tipo di spazio impedisce la rottura della linea, ma sembra proprio come qualsiasi altro spazio quando viene usato come personaggio. Usando rende abbastanza chiaro dove tali spazi compaiono nel testo.

8
Alireza

La risposta esatta dipende dal contesto. In generale, questi caratteri non devono essere presenti ( HTML 5.2 §3.2.4.2.5 ):

I nodi di testo e i valori degli attributi devono essere costituiti da caratteri Unicode, non devono contenere caratteri U + 0000, non devono contenere caratteri Unicode permanentemente indefiniti (caratteri non) e non devono contenere caratteri di controllo diversi dai caratteri di spazio. Questa specifica include vincoli extra sul valore esatto dei nodi di testo e dei valori degli attributi in base al loro preciso contesto.

Per gli elementi in HTML, i vincoli del modello di contenuto del testo dipendono anche dal tipo di elemento. Ad esempio, un "<" all'interno di un elemento textarea non ha bisogno di essere sfuggito in HTML perché textarea è un elemento di testo non formattabile.

Queste restrizioni sono sparse tra le specifiche. Ad esempio, i valori degli attributi ( §8.1.2.3 ) non devono contenere una e commerciale ambiguo e sia o (i) vuoto, (ii) tra virgolette singole (e quindi non deve contenere U + 0027 APOSTROPHE carattere '), (iii) tra virgolette (non deve contenere U + 0022 QUOTATION MARK carattere "), o (iv) non quotato - con le seguenti restrizioni:

... non deve contenere caratteri letterali nello spazio, qualsiasi U + 0022 caratteri QUOTAZIONE MARK ("), U + 0027 caratteri APOSTROPHE ('), U + 003D SEGNI EQUALS caratteri (=), U + 003C MENO-SEGNI caratteri () <), U + 003E caratteri di MAGGIORE-MAGGIORE SIGN (>), o U + 0060 caratteri ACCENTO della tomba (`), e non deve essere la stringa vuota.

1
Andrey