Django: Отсеивание опасных символов при вводе текста

У меня есть приложение Django, в котором несколько форм поддерживают ввод текста с максимальной длиной 50 или 250 символов. Во всех случаях введенные данные будут храниться в внутренней БД и будут доступны для последующего просмотра по запросу. Во всех случаях я использую метод cleaned_data() при сборе пользовательских данных из формы. И во всех случаях данные таковы, что большинство "специальных символов" не нужны. (Есть несколько, которые я хотел бы разрешить для удобства и гибкости, например дефисы или скобки, но кроме этого, букв и цифр должно хватить.)

Учитывая все это, я хочу установить дополнительный уровень проверки на эти поля, чтобы предотвратить инъекции. В частности, XSS, но также и других вредоносных вводов. Я думаю, что самым простым подходом будет блокирование/отклонение наиболее опасных символов - угловых скобок, фигурных скобок и прямых/обратных слэшей, которые являются наиболее очевидными. Мои вопросы таковы:

  • Есть ли еще персонажи, которых я должен блокировать/отклонять, чтобы защититься от инъекционных атак?
  • Или, может быть, мне лучше пойти по пути белых списков? Определить полный набор допустимых символов и отклонять все, что не входит в этот список?
  • Или - является ли здравой идея отсеивания полей с помощью моих собственных методов? Есть ли какая-то библиотека Django/Python, которую я мог бы использовать для такой проверки, а не создавать свою собственную?

Вы должны использовать заголовок Content-Security-Policy. При правильной настройке заголовок CSP предотвратит подавляющее большинство xss-уязвимостей.

django-csp предоставляет удобный способ реализации CSP в Django:

# settings.py

from csp.constants import SELF

CONTENT_SECURITY_POLICY = {
    "DIRECTIVES": {
        "default-src": [SELF],
    }
}

MIDDLEWARE = [
    'csp.middleware.CSPMiddleware',
    'django.middleware.security.SecurityMiddleware',
    ...
]

Обычно я начинаю с default-src 'self' (что предотвращает загрузку любого ресурса, не находящегося на вашем сервере), а затем разрешаю загрузку внешних ресурсов по мере необходимости. Например, если вы обслуживаете таблицы стилей с помощью cdn, ваш CSP будет выглядеть так:

CONTENT_SECURITY_POLICY = {
    "DIRECTIVES": {
        "default-src": [SELF],
        "style-src": [SELF, "https://some.cdn.net"],
    }
}

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

Вернуться на верх