По фреймворкам
Безопасность Django — DEBUG, SECRET_KEY и авторизация
У Django безопасные значения по умолчанию, но инциденты приходят из настроек: DEBUG=True в проде (раскрытие настроек/секретов), утёкший SECRET_KEY и слабая авторизация. Поставьте DEBUG=False, загружайте SECRET_KEY из окружения, авторизуйте явно. Защитно, без шагов атаки.
Для: всех, кто ведёт приложение на Django. Здесь нет шагов атаки — только как сохранить работу безопасных значений по умолчанию, закрывая пробелы, которые открывают настройки. Полную картину смотрите на хабе безопасности по фреймворкам.
Большая тройка ловушек (открываются в настройках)
Значения по умолчанию Django превосходны, но эти три вещи вам защищать в настройках и коде.
① DEBUG=True в проде
Страница ошибки раскрывает настройки, переменные окружения, секреты. Извлекается намеренными ошибками.
② Утёкший SECRET_KEY
Основа подписи/сессий/CSRF. Утечка грозит подделкой и подменой.
③ Слабая авторизация
Аутентифицирован, но нет проверок permission/владельца. Подмена ID раскрывает чужие данные.
Также следите за SQLi через raw()/extra() или интерполяцию строк, небезопасной десериализацией (pickle), незаданным ALLOWED_HOSTS и незакрытыми CVE зависимостей (pip).
Как их закрыть (3 шага)
DEBUG=False + ALLOWED_HOSTS в проде
ALLOWED_HOSTS. Не давайте показывать подробные ошибки наружу и настройте отдачу static/media для прода. Встройте это в деплой и проверяйте каждый раз.Загружайте SECRET_KEY из окружения, храните приватно
SECRET_KEY в код/репозиторий — загружайте из переменной окружения или менеджера секретов. Держите его вне публичных каталогов и страниц DEBUG и оперативно ротируйте, если он утёк (→ держите секреты вне публичных каталогов).Сделайте авторизацию явной и обрежьте опасные пути ввода
raw(), а также не восстанавливайте недоверенные данные через pickle. Держите зависимости (pip) под мониторингом CVE + быстро закрытыми (→ что такое IDOR).Частое (опасное)
- в проде оставлен
DEBUG=True SECRET_KEYзашит в код/репозиторий- нет авторизации — «залогинен = можно смотреть»
- интерполяция строк в
raw()·pickleна недоверенных данных
Правильно
- в проде DEBUG=False + ALLOWED_HOSTS
-
SECRET_KEYиз окружения, хранится приватно - явная авторизация (область permission/владельца)
- ORM/плейсхолдеры, без десериализации недоверенных данных
Взгляд этого сайта: батарейки в комплекте, но настройки и авторизация на вас
Django многое защищает по умолчанию, но настройки прода (DEBUG/SECRET_KEY/ALLOWED_HOSTS) и авторизацию вы должны выстроить верно под каждое окружение и приложение. Инциденты, которые мы видим снова и снова, — не изощрённые атаки, а паттерны настроек/эксплуатации: «отладка была открыта в проде», «секрет раскрылся», «не было авторизации». Поэтому центр тяжести — сузить настройки прода, держать секреты приватными и делать авторизацию явной. Не сломать надёжные значения по умолчанию — вот суть эксплуатации Django.
Читать дальше
- Хаб: безопасность по фреймворкам · безопасность Laravel (похожие DEBUG-в-проде / раскрытие секретов)
- Секреты: держите секреты вне публичных каталогов · Практика: плейбук реагирования на уязвимости
- Глоссарий: что такое IDOR · что такое SQL-инъекция
FAQ
QDjango — безопасный фреймворк?
Django идёт «с батарейками» — защита SQL на основе ORM, защита от CSRF, авто-экранирование в шаблонах и система auth стандартны. При корректной настройке это надёжный фреймворк, но инциденты приходят не из ядра, а из настроек. DEBUG=True в проде, утёкший SECRET_KEY и слабая авторизация повторяются не столько как специфичные для Django проблемы, сколько как проблемы эксплуатации/настроек.
QЧем опасно оставить DEBUG=True в проде?
При включённом DEBUG страница ошибки может показать подробные внутренности — настройки, переменные окружения, трассировки стека. Атакующий может намеренно вызывать ошибки, чтобы их извлечь. В проде всегда ставьте DEBUG=False и корректно настраивайте ALLOWED_HOSTS. Также не давайте показывать подробные ошибки наружу и пересмотрите отдачу static/media для прода.
QПочему важен SECRET_KEY?
SECRET_KEY — ключ, на котором держатся подписанные cookie и сессии, CSRF-токены, сброс паролей и другое. Утечка может привести к подделке или подмене всего этого. Не кладите SECRET_KEY в код или репозиторий — загружайте из переменной окружения или менеджера секретов и оперативно ротируйте, если он утёк. А также не давайте ему раскрыться через публичный каталог или страницу DEBUG.