2009-09-12 19 views
9

używam TinyMCE edytor fileds textarea w Django formach.Korzystanie bezpieczny filtr w Django dla bogatych pól tekstowych

Teraz, aby wyświetlać użytkownikowi tekst sformatowany, zmuszony jestem użyć filtru "bezpiecznego" w szablonach Django, aby tekst w formacie HTML mógł być wyświetlany w przeglądarce.

Załóżmy, że JavaScript jest wyłączony w przeglądarce użytkownika, TinyMCE nie załaduje się, a użytkownik może przekazać <script> lub inne znaczniki XSS z takiego pola textarea. Taki HTML nie będzie bezpieczny do wyświetlenia użytkownikowi.

Jak dbać o takiej niebezpiecznej HTML tekst, który nie pochodzi z TinyMCE?

Odpowiedz

10

Jesteś prawo być zaniepokojony surowego HTML, ale nie tylko dla przeglądarek Javascript niepełnosprawnych. Rozważając bezpieczeństwo swojego serwera, należy zignorować wszelkie prace wykonane w przeglądarce i sprawdzić wyłącznie, co serwer akceptuje i co się z nim dzieje. Twój serwer akceptuje HTML i wyświetla go na stronie. To jest niebezpieczne.

Fakt, że TinyMCE cytuje HTML jest fałszywy bezpieczeństwa: serwer ufa co to akceptuje, których nie powinny.

Rozwiązaniem tego problemu jest przetwarzanie HTML, kiedy nadejdzie, aby usunąć niebezpieczne konstrukcje. To skomplikowany problem do rozwiązania. Spójrz na XSS Cheat Sheet, aby zobaczyć różnorodne wejścia, które mogą powodować problemy.

lxml ma funkcję czyszczenia HTML: http://lxml.de/lxmlhtml.html#cleaning-up-html, ale nigdy jej nie użyłem, więc nie mogę ręczyć za jej jakość.

+1

Arkusz oszustów XSS jest dobrym przykładem tego, dlaczego wdrażanie procedur czyszczenia HTML jest procesem dość daremnym. Dodanie znaczników html na białej liście jest jedynym sposobem uniknięcia tego. –

+0

+1 za wspaniały link.Myślę, że moje przyszłe aplikacje będą miały do ​​tego mniej dziur. Dziękuję Ci. –

3

Nie ma dobrej odpowiedzi na tę. TinyMCE generuje HTML, a auto-escape django specjalnie usuwa HTML.

Tradycyjne rozwiązanie tego problemu polegało na użyciu języka znaczników innego niż HTML po stronie wprowadzania danych (bbcode, przecena itp.) Lub umieszczenia na białej liście ograniczonej liczby znaczników HTML. TinyMCE/HTML to na ogół tylko odpowiednie rozwiązania wejściowe dla mniej lub bardziej zaufanych użytkowników.

Podejście białej listy jest trudne do wdrożenia bez luk w zabezpieczeniach. Jedną z rzeczy, których nie chcesz robić, jest próba wykrycia "złych" tagów - BĘDZIESZ przegapić przypadków skrajnych.

7

Możesz użyć filtra szablonu "removetags" i po prostu usunąć "skrypt".

+4

'{{value | removetags:" "| safe}}' to działa idealnie. – Glycerine

+4

Nie rób tego. Intruz może wstrzyknąć javascript na wiele sposobów, oprócz użycia znacznika '

Powiązane problemy