Filtro JavaScript fuori HTML

Ho un editor di testo ricco che passa HTML al server. Questo codice HTML viene quindi mostrato ad altri utenti. Voglio assicurarmi che non ci sia JavaScript in quel codice HTML. C’è un modo per fare questo?

Inoltre, sto usando ASP.NET se questo aiuta.

La cosa più semplice da fare sarebbe rimuovere i tag con un’espressione regolare. Il guaio è che potresti fare un sacco di cose brutte senza tag di script (ad esempio immagini ingannevoli imbevute, avere link ad altri siti che hanno Javascript perverso). Disabilitare completamente HTML convertendo i caratteri minori o maggiori dei caratteri nelle loro forms di quadro HTML (ad es. <) Potrebbe anche essere un'opzione.

Se si desidera una soluzione più potente, in passato ho utilizzato AntiSamy per disinfettare il testo in entrata in modo che sia sicuro per la visualizzazione.

L’unico modo per garantire che qualche markup HTML non contenga JavaScript è filtrarlo di tutti i tag e gli attributi HTML non sicuri, al fine di prevenire Cross-Site Scripting (XSS).

Tuttavia, in generale non esiste un modo affidabile per rimuovere esplicitamente tutti gli elementi e gli attributi non sicuri dal loro nome, poiché alcuni browser potrebbero interpretare quelli di cui non si era nemmeno a conoscenza al momento della progettazione, e quindi aprire un buco di sicurezza per i malintenzionati utenti. Questo è il motivo per cui è molto meglio adottare un approccio whitelist piuttosto che uno blacklist . Vale a dire, consenti solo i tag HTML che sei sicuro e che rimuovono tutti gli altri per impostazione predefinita. In effetti, solo un tag accidentalmente consentito può rendere il tuo sito Web vulnerabile a XSS.


Whitelisting (buon approccio)

Leggi questo articolo sulla sanitizzazione dell’HTML , che offre alcuni esempi specifici dei motivi per cui dovresti inserire la whitelist anziché la lista nera. Citazione da quella pagina:

Ecco un elenco incompleto di tag e attributi HTML potenzialmente pericolosi:

  • script , che può contenere script dannosi
  • applet , embed e object , che possono automaticamente scaricare ed eseguire codice dannoso
  • meta , che può contenere reindirizzamenti dannosi
  • onload , onunload e tutti gli altri attributi on* , che possono contenere script dannosi
  • style , link e attributo di style , che può contenere script dannosi

Ecco un’altra pagina utile che suggerisce una serie di tag e attributi HTML, nonché attributi CSS che sono generalmente sicuri da consentire, nonché pratiche raccomandate.

Lista nera (approccio generalmente cattivo)

Sebbene molti siti Web abbiano in passato (e attualmente) utilizzato l’approccio di blacklisting, non c’è quasi mai alcun reale bisogno di farlo. (I rischi per la sicurezza invariabilmente superano i limiti potenziali che la whitelist applica con le capacità di formattazione concesse all’utente.) È necessario essere molto consapevoli dei suoi difetti.

Ad esempio, questa pagina fornisce un elenco di quelli che sono presumibilmente “tutti” i tag HTML che potresti voler eliminare. Solo osservandolo brevemente, dovresti notare che contiene un numero molto limitato di nomi di elementi; un browser potrebbe facilmente includere un tag proprietario che ha permesso involontariamente agli script di funzionare sulla tua pagina, che è essenzialmente il problema principale con la lista nera.


Infine, ti consiglio vivamente di utilizzare una libreria HTML DOM (come il noto HTML Agility Pack ) per .NET, anziché RegEx per eseguire la pulizia / whitelisting, poiché sarebbe molto più affidabile. (È abbastanza ansible creare un codice HTML offuscato piuttosto pazzo che può ingannare le espressioni regex! Un vero lettore / scrittore HTML rende la codifica del sistema molto più semplice, comunque.)

Speriamo che questo dovrebbe darti una decente panoramica di ciò che devi progettare al fine di prevenire (o almeno massimizzare) l’XSS, e come sia fondamentale che la sanitizzazione dell’HTML venga eseguita tenendo conto del fattore sconosciuto.

Come sottolineato da Lee Theobald, questo è un piano molto pericoloso. Non è ansible, per definizione, produrre codice HTML “sicuro” filtrando / blacklist, poiché l’utente potrebbe inserire elementi nell’HTML a cui non si è pensato (o che non esistono nemmeno nella versione del browser, ma in altri).

L’unico modo sicuro è un approccio whitelist, cioè elimina tutto tranne il testo semplice e determinati costrutti HTML specifici. Questo è per inciso ciò che stackoverflow.com fa :-).

Ecco come lo faccio usando un approccio white-listing (codice Javascript e Python)

https://github.com/dcollien/FilterHTML

Definisco una specifica per un sottoinsieme di HTML consentito, e questo è solo ciò che dovrebbe passare attraverso questo filtro. Esistono alcune opzioni per purificare gli attributi URL, consentendo solo alcuni schemi (come http :, ftp :, ecc.) E non consentire quelli che causerebbero problemi XSS / Javascript (come javascript :, o anche dati 🙂

edit: questo non ti darà il 100% di sicurezza pronto all’uso per tutte le situazioni, ma usato in modo intelligente e insieme ad alcuni altri trucchi (come controllare se gli URL sono sullo stesso dominio e il tipo di contenuto corretto, ecc.) potrebbe essere quello che ti serve

Se vuoi che l’html sia modificato in modo che gli utenti possano vedere il codice HTML stesso. Sostituisci una stringa di tutti i ‘<', '>‘, ‘&’ e ‘;’. Ad esempio ‘<' diventa '& lt;'.

Se vuoi che l’html funzioni, il modo più semplice è rimuovere tutto l’HTML e Javascript e quindi sostituire solo l’HTML. Sfortunatamente non c’è quasi nessun modo sicuro di rimuovere tutto il javascript e consentire solo l’HTML.

Ad esempio potresti voler consentire le immagini. Comunque potresti non sapere che puoi fare

  

e può eseguire quello script. Diventa molto pericoloso $ molto veloce. Questo è il motivo per cui la maggior parte dei siti Web come Wikipedia e questo sito Web utilizzano un linguaggio di markdown speciale. Ciò rende molto più semplice consentire la formattazione, ma non il javascript dannoso.

Potresti voler controllare come fanno alcuni editor WYSIWYG basati su browser come TinyMCE . Solitamente rimuovono JS e sembrano fare un lavoro ragionevole.