Risposte:
Se stai inserendo contenuto di testo nel tuo documento in una posizione in cui è previsto un contenuto di testo 1 , in genere devi solo sfuggire agli stessi caratteri che avresti in XML . All'interno di un elemento, questo include solo la &
e commerciale escape escape e il delimitatore elemento minore di e maggiore di segni <
>
:
& becomes &
< becomes <
> becomes >
All'interno dei valori degli attributi devi anche sfuggire al carattere di citazione che stai utilizzando:
" becomes "
' becomes '
In alcuni casi può essere sicuro evitare di sfuggire ad alcuni di questi personaggi, ma ti incoraggio a sfuggire a tutti e cinque in tutti i casi per ridurre la possibilità di fare un errore.
Se la codifica del tuo documento non supporta tutti i caratteri che stai utilizzando, ad esempio se stai provando a usare le emoji in un documento con codifica ASCII, devi anche sfuggire a questi. La maggior parte dei documenti in questi giorni sono codificati utilizzando la codifica UTF-8 che supporta Unicode, dove non sarà necessario.
In generale, non dovresti sfuggire agli spazi come
.
non è uno spazio normale, è uno spazio senza interruzioni . È possibile utilizzare questi al posto degli spazi normali per impedire l'inserimento di un'interruzione di riga tra due parole o per inserire spazio extra senza che venga automaticamente compresso, ma di solito è un caso raro. Non farlo a meno che tu non abbia un vincolo di progettazione che lo richieda.
1 Per "una posizione in cui è previsto il contenuto del testo", intendo all'interno di un elemento o un valore di attributo citato in cui si applicano le normali regole di analisi. Ad esempio: <p>HERE</p>
o <p title="HERE">...</p>
. Ciò che ho scritto sopra non si applica al contenuto che ha regole o significato di analisi speciali, come all'interno di uno script o di un 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ù semplice introdurre una vulnerabilità di sicurezza. Ti scoraggio fortemente dal non inserire mai contenuti dinamici in nessuna di queste posizioni. Ho visto team di sviluppatori competenti attenti alla sicurezza introdurre vulnerabilità ipotizzando di aver codificato questi valori correttamente, ma mancando un caso limite. Di solito esiste un'alternativa più sicura, come inserire il valore dinamico in un attributo e quindi gestirlo con JavaScript.
Se è necessario, leggere le Regole di prevenzione XSS del progetto Open Web Application Security per comprendere alcune delle preoccupazioni che è necessario tenere a mente.
Dipende dal contesto. Alcuni possibili contesti in HTML:
Vedi il foglio informativo sulla prevenzione degli script cross site di OWASP , in particolare le sezioni " Why Can't I Just HTML Entity Encode Data Untrusted? " E " XSS Prevention Rules ". Tuttavia, è meglio leggere l'intero documento.
Fondamentalmente, ci sono tre personaggi principali che dovrebbero sempre essere sfuggiti ai tuoi file HTML e XML, quindi non interagiscono con il resto dei markup, quindi, come probabilmente ti aspetti, due di loro saranno i wrapper di sintassi, che sono < >, sono elencati come di seguito:
1) < (<)
2) > (>)
3) & (&)
Inoltre possiamo usare la doppia virgoletta (") come" e la virgoletta singola (') come & apos
Evita di inserire contenuti dinamici <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.)
Personaggi di escape HTML: Elenco completo: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php
Quindi devi scappare <, o & quando seguito da qualcosa che potrebbe iniziare un riferimento al personaggio. Anche la regola sulle e commerciali è l'unica regola per gli attributi tra virgolette, poiché le virgolette corrispondenti sono l'unica cosa che ne terminerà una. Ma se non si desidera terminare il valore dell'attributo lì, sfuggire alle virgolette.
Passare a UTF-8 significa salvare nuovamente il file: l'
uso della codifica dei caratteri UTF-8 per la tua pagina significa che puoi evitare la necessità della maggior parte delle fughe e lavorare semplicemente con i caratteri. Si noti, tuttavia, che per modificare la codifica del documento, non è sufficiente modificare la dichiarazione di codifica nella parte superiore della pagina o sul server. Devi salvare nuovamente il documento in quella codifica. Per informazioni su come farlo con l'applicazione, leggi Impostazione della codifica nelle applicazioni di creazione Web.Personaggi invisibili o ambigui:
Un ruolo particolarmente utile per le fughe è quello di rappresentare personaggi invisibili o ambigui nella presentazione.
Un esempio potrebbe essere il carattere Unicode U + 200F MARCHIO DESTRO A SINISTRA. Questo carattere può essere usato per chiarire la direzionalità nel testo bidirezionale (ad es. Quando si usano gli script arabo o ebraico). Non ha forma grafica, tuttavia, quindi è difficile vedere dove si trovano questi caratteri nel testo e se vengono persi o dimenticati potrebbero creare risultati imprevisti durante le successive modifiche. L'uso (o il suo equivalente di riferimento di carattere numerico) invece rende molto facile individuare questi caratteri.
Un esempio di personaggio ambiguo è U + 00A0 NO-BREAK SPACE. Questo tipo di spazio impedisce l'interruzione di linea, ma assomiglia a qualsiasi altro spazio quando viene utilizzato come personaggio. L'uso rende abbastanza chiaro dove tali spazi appaiono nel testo.
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 U + 0000 caratteri, non devono contenere caratteri Unicode permanentemente indefiniti (non caratteri) e non devono contenere caratteri di controllo diversi dai caratteri spaziali. Questa specifica include ulteriori vincoli 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 di testo dipendono anche dal tipo di elemento. Ad esempio, non è necessario che un "<" all'interno di un elemento textarea sia sottoposto a escape in HTML perché textarea è un elemento di testo non elaborabile evitabile.
Queste restrizioni sono sparse tra le specifiche. Ad esempio, i valori degli attributi ( §8.1.2.3 ) non devono contenere una e commerciale ambigua ed essere (i) vuoto, (ii) tra virgolette singole (e quindi non devono contenere il carattere APOSTROPHE U + 0027 '
), (iii) tra virgolette doppie ( non deve contenere il carattere U + 0022 QUOTATION MARK "
) o (iv) non quotato - con le seguenti restrizioni:
... non deve contenere alcuno spazio letterale, nessun carattere U + 0022 QUOTATION MARK ("), U + 0027 caratteri APOSTROPHE ('), U + 003D EQUALS SIGN caratteri (=), U + 003C MENO-THAN SIGN caratteri ( <), U + 003E caratteri GREATER-THAN SIGN (>) o U + 0060 GRAVE ACCENT (()) e non devono essere la stringa vuota.
<p onclick="NOT-HERE">...</p>
e<p style="NOT-HERE">...</p>
.