Как предотвратить атаки XSS, когда мне нужно визуализировать HTML из редактора WYSIWYG? - PullRequest
10 голосов
/ 26 июля 2011

Нетехнические данные Справочная информация: Я работаю в школе, и мы создаем новый веб-сайт с использованием Django.Учителя, которые работают в школе, недостаточно технологичны, чтобы использовать другой язык MarkUp, такой как MarkDown.В конце концов мы решили, что нам следует использовать редактор WYSIWYG, который создает недостатки безопасности.Мы не слишком беспокоимся о самих учителях, но больше злых учеников, которые могут получить учетные данные учителя.

Техническая справочная информация: Мы работаем с Django 1.3 и не выбрали конкретногоРедактора пока нет.Мы склоняемся к javascript, такому как TINYMCE, но нас можно убедить использовать все, что обеспечивает безопасность и простоту использования.Поскольку WYSIWYG-редактор будет выводить HTML-код, который будет отображаться в документе, мы не можем просто избежать его.

Каков наилучший способ предотвращения вредоносного кода, при этом позволяя нетехническим учителям писать сообщения?1009 *

Ответы [ 3 ]

15 голосов
/ 15 июля 2012

Уже поздно, но вы можете попробовать Bleach , под капотом он использует html5lib, и вы также получите балансировку тегов.

Вот полный фрагмент:

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

Вы можете прочитать документы для отбеливания , чтобы вы могли адаптировать его к своемунеобходимо.

7 голосов
/ 26 июля 2011

Вам необходимо проанализировать HTML-код на сервере и удалить все теги и атрибуты, которые не соответствуют строгому белому списку.
Вы должны проанализировать его (или, по крайней мере, повторно отобразить его) как строгий XML-код, чтобы злоумышленники не моглииспользование различий между нечеткими парсерами.

Белый список не должен содержать <script>, <style>, <link> или <meta> и не должен включать атрибуты обработчика событий или style="".

Вы также должны проанализировать URL-адреса в href="" и src="" и убедиться, что они являются относительными путями, http:// или https://.

0 голосов
/ 26 июля 2011

@ SLaks - это правильно, что вам нужно выполнить санацию на сервере, поскольку студенты, которые крадут учетные данные учителя, могут использовать эти учетные данные для POST непосредственно на ваш сервер.

Python HTML sanitizer / scrubber / filter обсуждает существующие HTML-дезинфицирующие средства, доступные для python.

Я бы предложил начать с пустого белого списка, а затем с помощью редактора WYSIWYG создать фрагмент HTML-кода, используя каждую кнопку, чтобы вы знали варианты создаваемого HTML-кода, а затем внести в белый список только те теги / атрибуты, которые необходимы для поддержки. HTML это производит. Надеемся, что он не использует атрибут CSS style, поскольку он также может быть вектором XSS.

...