2009-01-15 11 views
9

Supponiamo di avere una semplice applicazione blog ASP.NET MVC e voglio consentire ai lettori di aggiungere commenti a un post sul blog. Se voglio evitare qualsiasi tipo di shenanigans XSS, potrei codificare tutti i commenti in HTML in modo che diventino innocui durante il rendering. Tuttavia, che cosa succede se volevo delle funzionalità di base come collegamenti ipertestuali, grassetto, corsivo, ecc.?Prevenzione XSS (Cross-site Scripting)

So che StackOverflow utilizza il WMD Markdown Editor, che sembra una grande scelta per quello che sto cercando di realizzare, se non per il fatto che supporta sia HTML e Markdown che leaves it open to XSS attacks.

+1

Per motivi di ricerca, potrebbe essere utile per cambiare il titolo in "Prevenzione XSS (Cross- scripting del sito) "al titolo. Per qualcuno che non conosce il suo nome descrittivo, XSS, potrebbe avere più difficoltà a trovare questo thread. – BuddyJoe

risposta

3

Quanto HTML hai intenzione di supportare? Solo grassetto/corsivo/le cose di base? In tal caso, puoi convertirli in sintassi markdown e quindi rimuovere il resto dell'HTML.

Lo spogliamento deve essere eseguito sul lato server, prima di memorizzarlo. È necessario convalidare l'input anche sul server, quando si cerca la vulnerabilità di SQL e altre cose indesiderate.

+0

Proprio sopra. Prendi un approccio whitelist - non un approccio alla lista nera. –

1

Suggerisco di inviare solo la sintassi del markdown. Sul front-end, il client può digitare markdown e avere un'anteprima HTML (come SO), ma solo inviare la sintassi markdown sul lato server. Quindi puoi convalidarlo, generare l'HTML, scapparlo e memorizzarlo.

Credo che sia il modo in cui la maggior parte di noi lo fa. In entrambi i casi, markdown è lì per alleviare chiunque dalla scrittura di codice HTML strutturato e dare potere a coloro che non saprebbero nemmeno come.

Se c'è qualcosa di specifico che ti piacerebbe fare con l'HTML, puoi modificarlo con l'ereditarietà CSS '.comment a {color: # F0F; } ', front-end JS o semplicemente attraversa il codice HTML generato dall'analisi del markdown prima di memorizzarlo.

0

È possibile utilizzare una whitelist HTML in modo che alcuni tag possano ancora essere utilizzati, ma tutto il resto è bloccato.

Ci sono strumenti che possono farlo per voi. SO utilizza the code che Slough linked.

2

Se avete bisogno di farlo nel browser: http://code.google.com/p/google-caja/wiki/JsHtmlSanitizer

+0

non puoi mai fidarti dell'input dell'utente, tutto ciò che viene dal browser potrebbe essere manomesso – rjlopes

+0

@rjlopes - Questo non è un problema se stai cercando di disinfettare il contenuto da un server per la presentazione nel client. –

+0

colpa mia ho pensato che doveva essere applicata sul client prima di inviare le informazioni al server.Comunque in questo caso particolare (controlli tu, il server) non ha molto senso sanificare il client. L'unico caso che dovrebbe essere utile è quando si fanno richieste Ajax a siti Web di terzi. – rjlopes