2009-10-28 16 views
18

Sto cercando un semplice disinfettante HTML scritto in JavaScript. Non è necessario essere sicuro al 100% con XSS.Semplice disinfettante HTML in Javascript

Sto implementando Markdown e l'editor Markdown WMD (il ramo master SO di github) sul mio sito web. Il problema è che l'HTML mostrato nell'anteprima dal vivo non è filtrato, come qui su SO. Sto cercando un disinfettante HTML semplice/veloce scritto in JavaScript in modo da poter filtrare il contenuto della finestra di anteprima.

Non c'è bisogno di un parser completo con protezione XSS completa. Non sto inviando l'output al server. Sto inviando il Markdown al server in cui utilizzo un disinfettante HTML completo e corretto prima di memorizzare il risultato nel database.

Google è assolutamente inutile per me. Ottengo solo centinaia di articoli (spesso errati) su come filtrare javascript dall'HTML generato dall'utente in tutti i tipi di linguaggi lato server.

UPDATE

ti spiego un po 'meglio il motivo per cui ho bisogno di questo. Il mio sito web ha un editor molto simile a quello qui su StackOverflow. C'è un'area di testo per inserire la sintassi MarkDown e una finestra di anteprima sotto di essa che ti mostra come apparirà dopo averlo inviato.

Quando l'utente invia qualcosa, viene inviato al server in formato MarkDown. Il server lo converte in HTML e quindi esegue un disinfettante HTML su di esso per ripulire l'HTML. MarkDown permette l'HTML arbitrario quindi ho bisogno di ripulirlo. Ad esempio, l'utente digita qualcosa come:

<script>alert('Boo!');</script> 

Il convertitore MarkDown non lo tocca poiché è HTML. Il disinfettante HTML lo spoglierà in modo che l'elemento di script non sia più disponibile.

Ma questo non è ciò che accade nella finestra di anteprima. La finestra di anteprima converte solo MarkDown in HTML ma non lo disinfetta. Quindi, la finestra di anteprima avrà un elemento di script. Ciò significa che la finestra di anteprima è diversa dal rendering effettivo sul server.

Voglio risolvere il problema, quindi ho bisogno di un disinfettante HTML JavaScript veloce e sporco. Qualcosa di semplice con l'elemento base/attributo lista nera e whitelist farà. Non è necessario che sia XSS sicuro perché la protezione XSS viene eseguita dal disinfettante HTML sul lato server.

Questo è solo per assicurarsi che la finestra di anteprima corrisponda al rendering effettivo del 99,99% delle volte, il che è abbastanza buono per me.

Potete essere d'aiuto? Grazie in anticipo!

+3

FWIW, lo odio quando l'anteprima non corrisponde a ciò che viene pubblicato. – Ms2ger

+1

@ ms2ger: Ecco perché ho bisogno del disinfettante HTML, in modo che l'anteprima corrisponda a ciò che il server fa sul back-end. –

+0

non è un problema consentire che sarebbero gli attaccanti a testare i loro attacchi nel loro browser mentre non si vede nessuno dei loro tentativi? – siukurnin

risposta

9

Si dovrebbe avere uno sguardo a quello raccomandato in questa domanda Sanitize/Rewrite HTML on the Client Side

E proprio per essere sicuri che non c'è bisogno di fare di più su XSS, consulta le risposte a questo How to prevent Javascript injection attacks within user-generated HTML

+1

Caja sembra utile, ma pesante. Dovrò testare se è abbastanza veloce. Ne dubito comunque. Sono sicuro di essere al sicuro da XSS perché l'HTML che sto analizzando non viene mai inviato al server. Sto inviando il Markdown originale. L'HTML che ho bisogno di disinfettare è solo l'anteprima e nessuno, tranne l'utente che lo scrive, lo vedrà mai. –

-1

per la mia funzione mi è importato solo che la stringa non sia vuota e contenga solo caratteri alfanumerici. Questo utilizza JS semplice e nessuna terza libreria o altro. Contiene una lunga regex, ma fa il lavoro;) Si può costruire su questo, ma avere la propria espressione regolare qualcosa di più simile '< script> | </script> '(con caratteri di escape se necessario, e meno gli spazi).;)

var validateString = function(string) { 

     var validity = true; 

     if(string == '') { validity = false; } 

     if(string.match(/[ |<|,|>|\.|\?|\/|:|;|"|'|{|\[|}|\]|\||\\|~|`|!|@|#|\$|%|\^|&|\*|\(|\)|_|\-|\+|=]+/) != null) { 

      validity = false; 
     } 

     return validity; 
    }