Сybersecurity

8 уроків
Консультації
#4 – Безопасность API: токены, JWT, auth, rate limits

#4 – Безопасность API: токены, JWT, auth, rate limits

API — основа общения между клиентом и сервером. В этом уроке вы узнаете, какие ошибки делают API уязвимыми, как работают атаки типа brute-force и enumeration, и как защитить свой сервер.

Відеоурок

Telegram group

Підписуйтесь на нашу групу в Телеграмі 🇺🇦

API и его особенности

Итак, напомним кратко, что такое API. API — это интерфейс, через который клиент (браузер, приложение, другой сервер) общается с серверной частью. У API нет формы — он работает через запросы: POST, GET, PUT, DELETE и другие.


Почему важно его защищать? Сегодня практически каждый сайт, мобильное приложение или сервис работает через API. А это значит, что если ваше API не защищено должным образом, злоумышленник может:

  • обойти авторизацию,
  • подобрать логины и пароли,
  • получить доступ к чужим данным,
  • или просто заспамить сервер миллионом запросов.


Классические ошибки в API

Теперь давайте поговорим об ошибках. Они простые, но из-за них страдают даже крупные компании.


1. Отсутствие проверки прав доступа.
Представим, что пользователь отправляет GET-запрос к ресурсу:

GET /api/users/5

Если нет проверок, он может получить данные чужого аккаунта. По аналогии можно получить и другие ресурсы.


2. Отсутствие ограничения на количество запросов.
Если не ограничить частоту обращений, злоумышленник может отправлять 1000 запросов в секунду и устроить brute-force или DDoS. Это может не украсть данные, но выведет сайт из строя.


3. Отсутствие токенов или слабая авторизация.
Если API открыт для всех или авторизация базируется на простой cookie без защиты, то злоумышленнику легко получить доступ и украсть данные.


4. Уязвимость к enumeration-атакам.
Если API выглядит так: /api/users/1, /2, /3, злоумышленник просто перебирает ID и собирает данные.


Что такое JWT и зачем он нужен?

JWT (JSON Web Token) — это стандарт авторизационных токенов. При входе сервер генерирует токен из трёх частей: заголовка, полезной нагрузки и подписи:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MX0.signature123

Клиент передаёт токен в заголовке запроса:

Authorization: Bearer <токен>


Как JWT может быть уязвим?

Представьте, что кто-то перехватил токен, расшифровал payload (вторую часть токена), поменял роль с "user" на "admin" и пересобрал токен.


Если сервер не проверяет подпись или использует слабый ключ — он примет подделанный токен.


Поэтому нельзя:

  • использовать слабые секреты,
  • принимать токены без проверки подписи,
  • доверять полезной нагрузке без валидации.


Что такое brute-force и enumeration?

Brute-force — это атака перебором паролей. Злоумышленник отправляет 1000 запросов в минуту на:

POST /api/login

Если нет ограничений по частоте — он подбирает пароль и входит.

Enumeration — это перебор ID:

GET /api/users/1
GET /api/users/2
GET /api/users/3

Если авторизация не проверяется — злоумышленник получает данные всех пользователей.


Rate Limiting — первая линия обороны

На помощь приходит Rate Limiting — ограничение количества запросов с одного IP за заданный промежуток времени.


Примеры:

  • не более 10 запросов в минуту на /api/login
  • не более 100 запросов в час с одного IP


При превышении лимита сервер возвращает: 429 Too Many Requests.


Реализовать можно через:

  • Nginx
  • Cloudflare
  • Express middleware
  • и другие инструменты


Это избавит от возможности автоматического перебора и повысит стабильность API.


Пример: атака на API

Рассмотрим пример на PHP (Laravel). Допустим, у нас есть маршрут:

Route::get('/api/user/{id}', function($id) {
	return User::find($id);
});

Злоумышленник отправляет:

GET /api/user/1
GET /api/user/2
GET /api/user/3

Если не проверять, что $id == auth()->id(), то он видит чужие данные. Исправленный код:

Route::middleware('auth:sanctum')->get('/api/user/{id}', function($id) {
	if ($id != auth()->id()) {
		abort(403);
	}
	return User::find($id);
});

Конкретные реализации могут отличаться в зависимости от проекта и фреймворка. Главное — всегда проверяйте права доступа, а не просто отдавайте данные по ID.

Завдання до уроку

Необхідно оформити передплату на проект, щоб отримати доступ до всіх домашніх завдань

Велике завдання за курсом

Вам необхідно оформити передплату на сайті, щоб мати доступ до всіх великих завдань. У завдання входить методика рішення, а також готовий проект з відповіддю до завдання.
PS: подібні завдання доступні при підписці від 1 місяця

Також варто подивитися

Вивчення мови PHP, а також MySQL
28 уроків
Создание игры на Unreal Engine 4 / FPS шутер
11 уроків
Создание сайта с нуля | Полноценная верстка сайта
11 уроків
AI Agents, Vibe Coding и разработка с Claude Code
1 урок
Python FastAPI / Изучение библиотеки с нуля
8 уроків
Вивчення JavaScript для початківців з нуля!
15 уроків
Коментарі
Додати коментар

Поки що коментарів немає