Безпека даних — це не просто набір складних ідей, які ви зобов'язані реалізувати "тому що так треба". Це дуже практична річ. І щоб зрозуміти, з чим ми маємо справу, розглянемо кілька простих питань.
Що таке безпека даних?
Уявіть, що ваш API — це сейф. Всередині — цінні дані користувачів, від імен та паролів до кредитних карток. Якщо ваш сейф зламаний або у нього дешева дверцята, будь-який зловмисник може проникнути всередину і витягнути з нього все, що йому потрібно. Під безпекою даних ми розуміємо сукупність технологій та практик, які захищають цей сейф від вторгнень.
По ідеї якщо безпека організована грамотно, ось що вона забезпечує:
- Конфіденційність: дані бачать лише ті, хто повинен їх бачити.
- Цілісність: ніхто не може підмінити або зіпсувати дані.
- Доступність: тільки авторизовані користувачі можуть отримати доступ до даних, коли вони цього хочуть.
Потенційні загрози для API
Ваш API ніколи не буде самотнім. Як тільки ви відкриваєте ендпоінти, ваш проєкт можна уявити як острів у морі запитів. І далеко не всі з них дружні. Ось, що може трапитися:
SQL-ін'єкції. Зловмисник відправляє шкідливі команди через параметри запиту. Наприклад, ви вводите ім'я користувача, а він вводить
'; DROP TABLE users; --.Перехоплення даних. Якщо ваш API не використовує HTTPS, всі дані можуть бути перехоплені будь-ким, поки вони "летять" через інтернет.
Brute-Force атаки. Давайте будемо чесними: рано чи пізно хтось спробує "зламати" ваш API, перебираючи логіни та паролі. Особливо якщо паролі... "admin" і "123456".
DDoS-атаки. Тут зловмисник відправляє стільки запитів до вашого API, що сервер перестає відповідати зовсім (і клієнтам, і вам).
Основи безпеки в Django REST Framework
На щастя, Django REST Framework створений з урахуванням усіх цих кошмарних сценаріїв. У DRF є кілька вбудованих інструментів, які допоможуть вам спокійно спати (а якщо не спати, то хоча б хвилюватися менше):
Аутентифікація: DRF надає багато механізмів аутентифікації: від базової токен-аутентифікації до JWT. Вони вже інтегровані та досить прості у використанні.
Дозволи (Permissions): ви можете легко обмежити доступ до ресурсів, використовуючи вбудовані класи:
AllowAny,IsAuthenticated,IsAuthenticatedOrReadOnlyі т.д.Валідація даних: DRF автоматично перевіряє вхідні дані за допомогою серіалізаторів.
Методи безпеки запитів: DRF підтримує "безпечні" HTTP-методи: GET, POST, PATCH, DELETE. І надає механізми для захисту від CSRF-атак (якщо ви працюєте з браузерним клієнтом).
Як DRF допомагає керувати доступом до ресурсів?
Для управління доступом DRF використовує три рівні перевірки:
- Аутентифікація: підтверджуємо, що користувач взагалі входить у систему.
- Дозволи: вирішуємо, які саме ресурси цей користувач може бачити або змінювати.
- Контроль даних: перевіряємо, що користувач може отримати доступ лише до своїх даних (що особливо важливо).
Приклад: якщо у вашому API є ендпоінт /orders, ми можемо зробити так, щоб кожен користувач бачив лише свої замовлення, навіть якщо він спробує вказати чужий ID замовлення у запиті.
Наслідки витоку даних
Якщо ваш API зламали, наслідки можуть бути жахливими:
- Фінансові втрати: хакери можуть вкрасти кошти ваших користувачів або компанії.
- Репутаційні ризики: ніхто не хоче працювати з компанією, дані якої легко вкрали.
- Юридичні проблеми: витік даних може порушити юридичні зобов'язання вашої компанії (наприклад, GDPR).
Наведемо приклад. У 2018 році один із великих сайтів з оренди житла втратив дані мільйонів користувачів через відсутність захисту API. Все почалося з простої витоку: API не перевіряв, кому належать замовлення. Навіть авторизований користувач міг бачити чужі дані.
Мораль цієї історії? Навіть найкрасивіший API з елегантною архітектурою стає марним, якщо він не захищений.
Приклад: перший погляд на налаштування безпеки API
Щоб не бути голослівними, давайте розберемо невеликий приклад налаштування безпеки:
Створення endpoint з обмеженням для автентифікованих користувачів
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
class MySecureEndpoint(APIView):
permission_classes = [IsAuthenticated] # Тільки для автентифікованих користувачів
def get(self, request):
return Response({"message": "Привіт, цей endpoint захищений!"})
Налаштування маршрутизації
# urls.py
from django.urls import path
from .views import MySecureEndpoint
urlpatterns = [
path('secure/', MySecureEndpoint.as_view(), name='secure-endpoint'),
]
Перевіримо доступ
- Якщо користувач НЕ авторизований, він отримає 401 Unauthorized.
- Якщо користувач авторизований, він побачить
{"message": "Привіт, цей endpoint захищений!"}.
Що далі?
Ми тільки почали заглиблюватися у світ безпеки API. На наступних лекціях ми розглянемо, як:
- використовувати вбудовані та кастомні дозволи (
IsAuthenticatedі кастомні правила); - працювати з CORS, щоб захистити ваші ендпоінти від неавторизованих фронтендів;
- використовувати HTTPS та SSL-сертифікати для захисту даних у процесі передачі.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ