Практичний посібник з безпеки Middleware у Django
У Django, Middleware — це потужний інструмент, який знаходиться між обробкою запиту та відповіді вашого додатку. Він дозволяє розробникам реалізовувати різноманітні функціональності, включаючи заходи безпеки, на рівні всього проекту. У цьому посібнику ми розглянемо безпеку Middleware у Django, його практичні застосування та приклади, щоб допомогти забезпечити ваш веб-додаток.
Що таке Middleware у Django?
У фреймворку Django Middleware — це набір хуків, які інтегруються в процес обробки запиту/відповіді. Кожен компонент middleware відповідає за виконання певної функції. Він може:
- Модифікувати запит до того, як він потрапить до виду.
- Модифікувати відповідь перед тим, як вона буде надіслана клієнту.
- Обробляти виключення та виконувати додаткові завдання.
Middleware Django визначається як список у налаштуванні MIDDLEWARE
у вашому проекті Django.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Безпека Middleware у Django
Django включає кілька компонентів middleware, призначених для підвищення безпеки вашого додатку. Ось кілька ключових компонентів middleware:
- SecurityMiddleware
- CSRF Middleware
- XFrameOptionsMiddleware
Розглянемо їх детальніше на практичних прикладах.
1. SecurityMiddleware
SecurityMiddleware
додає кілька заголовків безпеки до відповідей для захисту від загальних веб-уразливостей.
Особливості
- HTTP Strict Transport Security (HSTS): Забезпечує зв'язок через HTTPS.
- Content Security Policy (CSP): Керує ресурсами, які браузер може завантажувати.
- X-Content-Type-Options: Запобігає MIME sniffing.
Налаштування
Додайте SecurityMiddleware
до вашого списку MIDDLEWARE
та налаштуйте такі параметри в settings.py
:
SECURE_HSTS_SECONDS = 31536000 # Включити HSTS на 1 рік
SECURE_HSTS_INCLUDE_SUBDOMAINS = True # Застосувати HSTS до піддоменів
SECURE_HSTS_PRELOAD = True # Пре-завантажити HSTS
SECURE_SSL_REDIRECT = True # Перенаправити HTTP на HTTPS
SECURE_BROWSER_XSS_FILTER = True # Включити фільтр XSS у підтримуваних браузерах
SECURE_CONTENT_TYPE_NOSNIFF = True # Запобігти MIME sniffing
Приклад
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
...
]
SECURE_HSTS_SECONDS = 3600 # Встановити тривалість HSTS
SECURE_SSL_REDIRECT = True # Перенаправити всі HTTP запити на HTTPS
З цими налаштуваннями ваш додаток перенаправить всі HTTP запити на HTTPS та додасть заголовки HSTS для забезпечення безпечних з'єднань.
2. CSRF Middleware
CSRF Middleware
допомагає захистити ваш додаток від атак Cross-Site Request Forgery, вимагаючи валідний токен у формах.
Налаштування
Middleware увімкнено за замовчуванням. Ви повинні переконатися, що CsrfViewMiddleware
включений у список MIDDLEWARE
.
Приклад
У ваших видах використовуйте декоратори csrf_protect
або @csrf_exempt
залежно від потреби.
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.http import JsonResponse
@csrf_protect
def secure_view(request):
return JsonResponse({'message': 'CSRF токен є дійсним!'})
@csrf_exempt
def unprotected_view(request):
return JsonResponse({'message': 'Цей вигляд не захищений від CSRF.'})
Щоб включити токен CSRF у формах, використовуйте шаблонний тег {% csrf_token %}
.
{% csrf_token %}
Надіслати
## XFrameOptionsMiddleware
`XFrameOptionsMiddleware` захищає ваш додаток від атак clickjacking, встановлюючи заголовок `X-Frame-Options`.
### Налаштування
За замовчуванням цей middleware увімкнено. Ви можете налаштувати його за допомогою параметра `X_FRAME_OPTIONS`:
XFRAMEOPTIONS = 'DENY' # Запобігає вбудовуванню сайту в iframe
```
Приклад
Щоб дозволити вбудовування у конкретних випадках, переопишіть стандартну поведінку в вигляді:
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def embed_view(request):
return JsonResponse({'message': 'Цей вигляд можна вбудовувати в iframe.'})
Створення власного Middleware для безпеки
Ви також можете створювати власний middleware для реалізації додаткових заходів безпеки.
Приклад: Middleware для білого списку IP
from django.http import HttpResponseForbidden
class IPWhitelistMiddleware:
ALLOWED_IPS = ['127.0.0.1', '192.168.1.1']
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
ip = request.META.get('REMOTE_ADDR')
if ip not in self.ALLOWED_IPS:
return HttpResponseForbidden('Доступ заборонено')
return self.get_response(request)
Додайте цей middleware до списку MIDDLEWARE
:
MIDDLEWARE = [
'path.to.IPWhitelistMiddleware',
...
]
Цей middleware заблокує всі запити, окрім тих, що надходять з дозволених IP-адрес.
Тестування Security Middleware
Щоб перевірити безпекові заголовки:
- Запустіть сервер Django.
- Відкрийте інструменти розробника в браузері.
- Перейдіть на вкладку "Network" та перевірте заголовки відповіді.
Ви повинні побачити такі заголовки, як Strict-Transport-Security
, X-Frame-Options
та X-Content-Type-Options
, додані до ваших відповідей.
Висновок
Security middleware у Django надає потужні інструменти для захисту вашого додатку від поширених загроз безпеки. Правильно налаштувавши SecurityMiddleware
, CSRF Middleware
та XFrameOptionsMiddleware
, ви значно підвищите безпеку вашого додатку. Додатково, створення власного middleware дозволяє реалізувати специфічні заходи безпеки для вашого проекту.
Використовуйте цей посібник, щоб забезпечити ваші Django-додатки та створити більш безпечний досвід для користувачів.
Дякую за прочитане. Якщо ви помітили помилки або маєте кращі способи виконання цього, дайте знати в коментарях нижче.
Якщо вам сподобалася стаття, натисніть кнопку 👏, щоб інші могли знайти її корисною. Ви також можете підписатися на мене на
GitHub | daily.dev | LinkedIn | YouTube
Перекладено з: Practical Guide to Security Middleware in Django