Проектируя API, легко забыть о безопасности и надёжности. Ниже - шесть частых проблем, из-за которых страдают сервисы и пользователи.
1. Передача параметров через GET
Когда секретные данные (пароль, номер карты) попадают в URL, они сохраняются в логах сервера, истории браузера и могут быть подсмотрены. Поэтому для любых чувствительных данных используйте POST или PUT, передавая их в теле запроса через HTTPS.
2. Передача секретного ключа в каждом запросе
Если клиент каждый раз отправляет один и тот же ключ, его легко украсть или перехватить. Вместо этого мы используем зашифрованную сигнатуру: сам ключ никогда не передаётся, а каждый запрос подписывается с его помощью. Сервер проверяет подпись, не получая самого ключа. Это снижает риск кражи.
3. Открытый ключ в базе данных
Хранить ключи или пароли в открытом виде в БД опасно: если базу украдут, злоумышленник сможет отправлять запросы от имени пользователей. Поэтому в базе должны лежать только хеши или зашифрованные значения, из которых нельзя восстановить исходный секрет.
4. Нет защиты от Race Conditions
Одновременные запросы могут привести к двойному списанию средств или другим ошибкам. Nonce здесь не поможет - он защищает от повторов, но не от гонок. Мы используем атомарную файловую защиту: операции проверки и изменения данных выполняются как единое целое, поэтому параллельные запросы не могут нарушить целостность.
5. Нет уникального идентификатора запроса
Если клиент повторяет запрос из-за сбоя сети, а сервер не различает дубликаты, одна и та же операция может выполниться дважды. Чтобы этого избежать, клиент должен присылать уникальный идентификатор (например, UUID), а сервер - сохранять его и игнорировать повторные запросы с тем же ID.
6. JSON передаёт только float
Для финансовых данных тип float неприемлем: он даёт ошибки округления (например, 0.1 + 0.2 = 0.30000000000000004). В JSON нужно передавать деньги строками или целыми числами в минимальных единицах (копейках).
Эти шесть пунктов - базовый минимум, который убережёт ваше API от самых распространённых уязвимостей и ошибок.