Поставляется ли Django с предустановленной безопасностью из коробки?
Предположим, я хочу создать Django-проект для ведения списков продуктов. Каждый список содержит несколько типичных продуктов. Проект имеет простой REST API, который используется для CRUD списков и товаров. У каждого списка есть владелец (пользователь), так что доступ к любому списку через REST API может получить только владелец и никто другой.
Если бы я делал этот проект, я бы предпринял следующие действия:
- Создайте свежий проект Django с помощью командного инструмента Django admin.
- Создайте модели элементов списка продуктов с полями для заголовка, даты создания, владельца и того, отмечен ли элемент галочкой или нет.
- Создайте представления для REST API. Представления будут проверять, является ли пользователь, который хочет выполнить действие над моделью (список продуктов или элемент) через API, тем же владельцем модели, над которой выполняется действие. Если пользователи совпадают, то представление выполняет действие над моделью, иначе оно отвечает ошибкой разрешения. .
- Выполните некоторые другие рутинные задачи, такие как миграция и т.д.
Какие еще конфигурации, влияющие на безопасность, мне нужно изменить, чтобы проект работал в соответствии с моими наивными и интуитивными ожиданиями? Меня действительно беспокоит тот факт, что Django или любой другой веб-фреймворк может иметь какую-то переменную, какой-то метод, какой-то встроенный обработчик URL, что-то, что не будет сочетаться с моими ожиданиями безопасности из коробки. Например, предположим, что в приложении администратора есть представление, сопоставленное с URL, которое отвечает дампом всей базы данных, включая всех пользователей, хэши паролей, соли, приватную информацию и т.д.. И обработчик не требует никакой аутентификации от сессии. В этом случае какой-то нехороший человек мог бы легко получить всю базу данных, распространив приватную информацию всех пользователей и заставив меня нарушить все законы конфиденциальности в интернете. Но это представление делает это только и только в том случае, если некоторый атрибут (назовем его ADMIN_DEBUG_DB) в settings.py установлен в true. И он действительно будет установлен в true из коробки. Я могу не знать об этом, например, из-за того, что пропустил это при чтении документации или просто забыл об этом. Есть ли в Django такие возможности, которые влияют на безопасность (кроме опции DEBUG)? Разрабатывается ли Django с идеей "прийти безопасным и оправдать все наивные интуитивные ожидания из коробки"?
Для начала повернитесь Debug=False - это то, с чего вам нужно начать.
Django имеет встроенную защиту для многих вещей, включая CSRF, XSS, SQL Injection (если вы используете встроенный Django ORM), защиту от Clickjacking, валидацию заголовков Host и т.д.
Вы можете получить хороший обзор всех этих здесь
Кроме того, администраторский сайт защищен именем пользователя/паролем. Поэтому кто-то не сможет просто так посмотреть содержимое вашей базы данных, если только вы не сделаете это на общедоступном API или веб-странице.