2009-09-12 14 views
9

Sto usando l'editor TinyMCE per i campi textarea nei moduli Django.Uso del filtro sicuro in Django per i campi rich text

Ora, per visualizzare il rich text all'utente, sono obbligato a utilizzare il filtro "sicuro" nei modelli Django in modo che il rich text HTML possa essere visualizzato sul browser.

è disabilitato Supponiamo JavaScript sul browser dell'utente, TinyMCE non verranno caricati e l'utente potrebbe passare <script> o altro XSS tag da un tale campo textarea. Tale codice HTML non sarà sicuro da visualizzare all'utente.

Come mi prendo cura di un testo HTML non sicuro che non proviene da TinyMCE?

risposta

10

Hai ragione a preoccuparti dell'HTML grezzo, ma non solo per i browser con Javascript disabilitato. Quando si prende in considerazione la sicurezza del proprio server, è necessario ignorare qualsiasi lavoro svolto nel browser e osservare esclusivamente ciò che il server accetta e ciò che accade ad esso. Il tuo server accetta HTML e lo visualizza sulla pagina. Questo non è sicuro.

Il fatto che TinyMce citi l'HTML è una falsa sicurezza: il server si fida di ciò che accetta, cosa che non dovrebbe.

La soluzione è elaborare l'HTML quando arriva, rimuovere i costrutti pericolosi. Questo è un problema complicato da risolvere. Dai uno sguardo allo XSS Cheat Sheet per vedere l'ampia varietà di ingressi che potrebbero causare un problema.

lxml ha una funzione per pulire HTML: http://lxml.de/lxmlhtml.html#cleaning-up-html, ma non l'ho mai usato, quindi non posso garantire per la sua qualità.

+1

Il cheat XSS è un buon esempio del perché l'implementazione di routine di pulizia HTML è un processo abbastanza inutile. La whitelist dei tag html è davvero l'unico modo per evitarlo completamente. –

+0

+1 per il link meraviglioso.Penso che le mie future app avranno meno buchi per questo. Grazie. –

3

Non c'è una buona risposta a questo. TinyMCE genera HTML e l'auto-escape di django rimuove specificamente l'HTML.

La soluzione tradizionale a questo problema è stata utilizzare un linguaggio di markup non html nel lato di input dell'utente (bbcode, markdown, ecc.) O inserire un numero limitato di tag HTML nella whitelist. TinyMCE/HTML sono generalmente solo soluzioni di input appropriate per utenti più o meno fidati.

L'approccio della white list è complicato da implementare senza buchi di sicurezza. L'unica cosa che non vuoi fare è provare a rilevare solo tag "cattivi": ti mancheranno i casi limite.

7

È possibile utilizzare il filtro modello "removetags" e rimuovere solo "script".

+4

'{{value | removetags:" "| safe}}' questo funziona perfettamente. – Glycerine

+4

Si prega di non farlo. Ci sono molti modi in cui un utente malintenzionato può iniettare javascript oltre che usare il tag '

Problemi correlati