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"],
}
}
Будьте внимательны: Заголовки безопасности могут быть сложными в применении. Вам придется провести исследование, чтобы определить, какие политики следует установить.