Quali sono le difese comuni contro XSS?

In altre parole, quali sono le tecniche più utilizzate per disinfettare input e / o output al giorno d’oggi? Che cosa usano le persone in siti industriali (o anche solo per uso personale) per combattere il problema?

È necessario fare riferimento all’ottimo sito Web OWASP per un riepilogo degli attacchi ( incluso XSS ) e delle difese contro di essi. Ecco la spiegazione più semplice che potrei fornire, che potrebbe essere effettivamente più leggibile della loro pagina web (ma probabilmente in nessun posto quasi completa).

  1. Specifica di un set di caratteri. Prima di tutto, assicurati che la tua pagina web specifichi il set di caratteri UTF-8 nelle intestazioni o all’inizio dell’elemento head HTML codifica tutti gli input per prevenire un attacco UTF-7 in Internet Explorer (e versioni precedenti di Firefox) nonostante altri sforzi per prevenire XSS.

  2. Escape HTML. Tieni presente che è necessario eseguire l’escape HTML per tutti gli input dell’utente. Ciò include la sostituzione di < con < , > con > , & con & e " con " Se utilizzerai mai attributi HTML con virgolette singole, dovrai sostituire ' con ' . Tipici linguaggi di scripting lato server come PHP forniscono funzioni per farlo, e ti incoraggio a estendeteli creando funzioni standard per inserire elementi HTML anziché inserirli in modo ad-hoc.

  3. Altri tipi di fuga. È comunque necessario fare attenzione a non inserire mai l'input dell'utente come attributo non quotato o un attributo interpretato come JavaScript (es. onload o onmouseover ). Ovviamente, questo si applica anche agli elementi di script , a meno che l'input non sia correttamente JavaScript-escape, che è diverso dall'escaping HTML. Un altro tipo speciale di escape è l'escape dell'URL per i parametri URL (fallo prima dell'escaping HTML per includere correttamente un parametro in un link).

  4. Convalida di URL e valori CSS. Lo stesso vale per gli URL di collegamenti e immagini (senza convalida in base ai prefissi approvati) a causa dello schema javascript: URL e anche degli URL e dei fogli di stile CSS all'interno degli attributi di style . (Internet Explorer consente l'inserimento di espressioni JavaScript come valori CSS, e Firefox è altrettanto problematico con il suo supporto XBL.) Se devi includere un valore CSS da una fonte non attendibile, devi tranquillamente e rigorosamente convalidare o CSS evitarlo.

  5. Non consentire l'HTML fornito dall'utente. Non consentire l'HTML fornito dall'utente se si dispone dell'opzione. Questo è un modo semplice per finire con un problema XSS, e così è scrivere un "parser" per il proprio linguaggio di markup basato su sostituzioni semplici regex. Permetterei solo il testo formattato se l'output HTML è stato generato in modo ovviamente sicuro da un parser reale che sfugge a qualsiasi testo dall'input utilizzando le funzioni di escape standard e crea singolarmente gli elementi HTML. Se non si ha scelta sull'argomento, utilizzare un validatore / disinfettante come AntiSamy .

  6. Prevenzione di XSS basato su DOM. Non includere l'input dell'utente nel codice HTML generato da JavaScript e inserirlo nel documento. Invece, usa i metodi DOM appropriati per assicurarti che sia elaborato come testo, non come HTML.

Ovviamente, non posso coprire ogni singolo caso in cui un utente malintenzionato può inserire codice JavaScript. In generale, i cookie solo HTTP possono essere utilizzati per rendere un attacco XSS un po 'più difficile (ma in nessun modo per prevenirne uno) e fornire ai programmatori un addestramento sulla sicurezza è essenziale.

Esistono due tipi di attacco XSS. Uno è dove il tuo sito consente di iniettare l’HTML in qualche modo. Questo non è così difficile da difendere: o sfuggire a tutti i dati di input dell’utente, o rimuovere tutti i tag <> e supportare invece qualcosa come il codice UBB. Nota: gli URL potrebbero ancora aprirti agli attacchi di tipo rolling-to-roll.

Quanto più insidioso è dove alcuni siti di terze parti contengono un tag IFRAME, SCRIPT o IMG o simili che raggiunge un URL sul tuo sito e questo URL utilizzerà qualsiasi autenticazione che l’utente attualmente ha nei confronti del tuo sito. Pertanto, non si dovrebbe mai e poi mai intraprendere alcuna azione diretta in risposta a una richiesta GET. Se ricevi una richiesta GET che tenta di fare qualsiasi cosa (aggiornare un profilo, controllare un carrello della spesa, ecc.), Allora dovresti rispondere con un modulo che a sua volta richiede l’accettazione di un POST. Questo modulo dovrebbe contenere anche un token di falsificazione di richiesta cross-site, in modo che nessuno possa creare un modulo su un sito di terze parti impostato per inviare al tuo sito utilizzando campi nascosti (di nuovo, per evitare un attacco di masquerading).

Ci sono solo due aree principali nel codice che devono essere affrontate correttamente per evitare problemi con xss.

  1. prima di utilizzare qualsiasi valore di input dell’utente nelle query, utilizzare le funzioni di supporto del database come mysql_escape_string sui dati e quindi utilizzarlo nella query. Garantirà la sicurezza di xss.

  2. prima di visualizzare i valori di input dell’utente nei campi di input del modulo, passarli attraverso htmlspecialchars o htmlentities. Questo convertirà tutti i valori inclini di xss in caratteri che il browser può visualizzare senza essere compromesso.

Una volta che hai fatto quanto sopra, sei al sicuro oltre il 95% dagli attacchi xss. Quindi puoi andare avanti e apprendere tecniche avanzate dai siti Web di sicurezza e applicare ulteriore sicurezza sul tuo sito.

Ciò che la maggior parte dei framework è che scoraggiano a scrivere direttamente il codice del modulo html o eseguire query in forma di stringa, in modo che l’utilizzo delle funzioni helper del framework rimanga pulito, mentre qualsiasi problema serio può essere risolto rapidamente semplicemente aggiornando una o due righe di codice nel framework. Puoi semplicemente scrivere una piccola libreria personale con funzioni comuni e riutilizzarle in tutti i tuoi progetti.

Se stai sviluppando in .NET uno dei modi più efficaci per evitare XSS è utilizzare la libreria Microsoft AntiXSS . È un modo molto efficace per disinfettare i tuoi input.

In JSTL / JSP il modo migliore per proteggersi da XSS è utilizzare il tag c: out senza impostare il parametro escapeXml predefinito uguale a false.