2011-07-26 11 views
9

Dodatkowe informacje techniczne: Pracuję dla szkoły i budujemy nową stronę internetową przy użyciu Django. Nauczyciele, którzy pracują dla szkoły, nie są wystarczająco kompetentni pod względem technologicznym, aby używać innego języka MarkUp, takiego jak MarkDown. Ostatecznie zdecydowaliśmy, że powinniśmy użyć edytora WYSIWYG, który stwarza luki w zabezpieczeniach. Nie martwimy się zbytnio o samych nauczycieli, ale o bardziej złośliwych uczniów, którzy mogą uzyskać referencje nauczyciela.Jak zapobiegać atakom XSS, gdy trzeba renderować HTML z edytora WYSIWYG?

Informacje techniczne: Używamy Django 1.3 i nie wybrałem jeszcze konkretnego edytora. Skłaniamy się ku takiemu javascriptowi jak TINYMCE, ale można go przekonać do użycia wszystkiego, co pozwala na bezpieczeństwo i łatwość użycia. Ponieważ edytor WYSIWYG będzie wyświetlał HTML w celu renderowania do dokumentu, nie możemy po prostu tego uniknąć.

Jaki jest najlepszy sposób na zapobieganie złośliwemu kodowi, a jednocześnie ułatwia nauczycielom nietechnicznym pisanie postów?

+0

[komentarz boczny: ckEditor ma kilka ładnie wyglądających integracji django, w tym wysyłanie obrazów i przeglądanie pakietów. dobry alt do TinyMCE. Nie jestem pewien, czy to pomaga w XSS!] – Spacedman

Odpowiedz

7

Należy przeanalizować kod HTML na serwerze i usunąć wszelkie tagi i atrybuty, które nie spełniają ścisłej białej listy.
Powinieneś parsować (lub przynajmniej ponownie renderować) jako ścisły XML, aby uniemożliwić napastnikowi wykorzystywanie różnic między parserami rozmytymi.

Biała lista nie musi zawierać <script>, <style>, <link> lub <meta> i nie musi zawierać atrybuty obsługi zdarzeń lub style="".

Należy również przeanalizować adresy URL href="" i src="" i upewnij się, że są one albo ścieżki względne, http:// lub https://.

0

@SLaks ma rację, że musisz zrobić sanitację na serwerze, ponieważ uczniowie, którzy kradną dane uwierzytelniające nauczyciela, mogą użyć tych poświadczeń do POST bezpośrednio na twój serwer.

Python HTML sanitizer/scrubber/filter omawia istniejące sanitizers HTML dostępne dla Pythona.

Proponuję zacząć od pustej białej listy, a następnie użyć edytora WYSIWYG do utworzenia fragmentu kodu HTML za pomocą każdego przycisku, aby poznać odmiany produkowanego przez niego HTML, a następnie dodać do białej listy tylko tagi/atrybuty potrzebne do obsługuje HTML, który generuje. Mam nadzieję, że nie używa on atrybutu CSS style, ponieważ mogą to być również wektory XSS.

14

Jest późno, ale możesz spróbować Bleach, pod maską korzysta z html5lib, a także uzyskasz równoważenie tagów.

Powyżej znajduje się pełna urywek:

settings.py

BLEACH_VALID_TAGS = ['p', 'b', 'i', 'strike', 'ul', 'li', 'ol', 'br', 
        'span', 'blockquote', 'hr', 'a', 'img'] 
BLEACH_VALID_ATTRS = { 
    'span': ['style', ], 
    'p': ['align', ], 
    'a': ['href', 'rel'], 
    'img': ['src', 'alt', 'style'], 
} 
BLEACH_VALID_STYLES = ['color', 'cursor', 'float', 'margin'] 

app/forms.py

import bleach 
from django.conf import settings 

class MyModelForm(forms.ModelForm): 
    myfield = forms.CharField(widget=MyWYSIWYGEditor) 


    class Meta: 
     model = MyModel 

    def clean_myfield(self): 
     myfield = self.cleaned_data.get('myfield', '') 
     cleaned_text = bleach.clean(myfield, settings.BLEACH_VALID_TAGS, settings.BLEACH_VALID_ATTRS, settings.BLEACH_VALID_STYLES) 
     return cleaned_text #sanitize html 

można przeczytać bleach docs, dzięki czemu można dostosować go do swoich potrzeb .

Powiązane problemy