Permettere agli utenti di inserire un sottoinsieme sicuro di HTML

10

Recentemente ho postato questa domanda su Code Review e mi è stato raccomandato di chiederlo a voi ragazzi.

Fondamentalmente, questo sarà usato per consentire agli utenti di generare contenuti formattati. Viene inserito all'interno di tag HTML, quindi non devo preoccuparmi di un utente malintenzionato che esce da un attributo. Se questo non è chiaro, ecco un esempio:

<div>
Generated content
</div>

Modifica: non sto inserendo il contenuto in un attributo, quindi le citazioni di escape non sono un problema. So che devo ancora controllare gli attributi errati all'interno del contenuto generato dall'utente, che è ciò che una grande parte dello script è per.

Ho stabilito che sono vulnerabile a un utente malintenzionato che pubblica un link dannoso o pubblica un'immagine di tracciamento, ma è una cosa che sono disposto ad accettare. Non penso che tu possa impedirlo senza URL di elenchi bianchi, il che ridurrebbe drasticamente la libertà che gli utenti hanno. Se esiste un modo fattibile per risolvere questa vulnerabilità, mi piacerebbe saperlo.

Ho letto il foglio cheat OWASP XSS , e penso di avere tutti quelle basi coperte.

Di cosa devo preoccuparmi al di fuori di quel cheat sheet? Mi sono perso qualcosa? Il mio codice è a prova di futuro? Sono sopra la mia testa? Dovrei semplicemente passare a BBCode o Markup?

Codice corrente

    
posta Meredith 16.06.2014 - 08:36
fonte

3 risposte

13

Sei nella giusta direzione mentre procedi con la whitelist, ma implementarla a prova di proiettile è complicata.

vale a dire. i tuoi link possono essere ingannati per eseguire JS semplicemente scrivendo:

<a href="JAVASCRIPT:xxx">xss</a>

Inoltre, specialmente i browser più vecchi possono eseguire JS in img src ecc.

Ti consiglierei di andare con HTMLPurifier , che, oltre all'XSS, ti aiuta anche a gestire l'HTML non funzionante (nidificazione dei tag, ecc. ).

    
risposta data 16.06.2014 - 10:51
fonte
10

Riepilogo: utilizza un disinfettante HTML, ma solo in combinazione con un criterio di sicurezza dei contenuti in quanto esistono costantemente nuovi modi per aggirare i filtri.

Dopo la tua elaborazione per consentire l'accesso al sottoinsieme dei tag HTML in white list, devi passare il tuo contenuto tramite un disinfettante HTML.

Oltre a utilizzare una sorta di disinfettante HTML, si consiglia di implementare un Content Security Politica anche sulle pagine con contenuto HTML dell'utente. Questo è un meccanismo implementato da un browser che bloccherà il JavaScript in linea dall'esecuzione se l'utente riesce a inserire script dannosi. Puoi impostare il CSP in modo che venga consentito solo il contenuto di .js esterno (sul tuo dominio o su altri che hai come white-list, ad es. Google Hosted Libraries).

Questi passaggi garantiranno che se un utente immette javascript:alert('foo'); o qualsiasi altro come collegamento, non verrà eseguito. Se stai accettando i tag img e a , questi potrebbero puntare a qualsiasi indirizzo web. Potrebbero tracciare, ma le informazioni sulla sessione non potranno essere inviate con loro (ad esempio document.cookie ) a causa del CSP.

Alla fine ci sono sempre buchi nei disinfettanti HTML mentre i browser e la lingua del web si sviluppano, come ad esempio questo nelle vecchie versioni di HTML Purifier (< = v4.1.0). Questo è il motivo per cui raccomando entrambi gli approcci in combinazione l'uno con l'altro per garantire che le lacune in un metodo non ti lascino vulnerabile.

    
risposta data 16.06.2014 - 11:19
fonte
-1

Non è consigliabile provare a implementare questo da soli. Se decidi di andare con l'HTML fornito dall'utente dovresti dare un'occhiata a OWASP ESAPI per php qui .

    
risposta data 16.06.2014 - 12:14
fonte

Leggi altre domande sui tag