|
1 | 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [Português (Brasil)](./README-pt_BR.md) | [Français](./README-fr.md) | [한국어](./README-ko.md) | [Nederlands](./README-nl.md) | [Indonesia](./README-id.md) | [ไทย](./README-th.md) | [Українська](./README-uk.md) | [Español](./README-es.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [Deutsch](./README-de.md) | [Türkçe](./README-tr.md) | [Tiếng Việt](./README-vi.md) | [Монгол](./README-mn.md) | [हिंदी](./README-hi.md) | [العربية](./README-ar.md) | [Polski](./README-pl.md) | [Македонски](./README-mk.md) | [ລາວ](./README-lo.md) |
2 | 2 |
|
3 | 3 | # Контрольный список безопасности API |
4 | | -Контрольный список наиболее важных контрмер безопасности при разработке, тестировании и выпуске вашего API. |
| 4 | +Чеклист наиболее важных контрмер по безопасности при разработке, тестировании и выпуске вашего API. |
5 | 5 |
|
6 | 6 |
|
7 | 7 | --- |
8 | 8 |
|
9 | 9 | ## Аутентификация |
10 | | -- [ ] Не используйте `Basic Auth` Используйте стандартную проверку подлинности (например: JWT, OAuth). |
11 | | -- [ ] Не "изобретайте колесо" в `аутентификации`, `создании токенов`, `хранении паролей`. Используйте стандарты. |
12 | | -- [ ] Используйте `Max Retry` и функции jail в Login. |
| 10 | +- [ ] Не используйте `Basic Auth`. Используйте стандартную проверку подлинности (например: JWT, OAuth). |
| 11 | +- [ ] Не изобретайте велосипед для `аутентификации`, `создании токенов`, `хранении паролей`. Используйте стандарты, проверенные библиотеки. |
| 12 | +- [ ] Используйте `Max Retry` и функции jail во время аутентификации. |
13 | 13 | - [ ] Используйте шифрование для всех конфиденциальных данных. |
14 | 14 |
|
15 | 15 | ### JWT (JSON Web Token) |
16 | | -- [ ] Используйте случайный сложный ключ (`JWT Secret`), чтобы сделать брут форс токена очень сложным. |
17 | | -- [ ] Не извлекайте алгоритм из полезной нагрузки. Внесите алгоритм в бэкэнд (`HS256` или `RS256`). |
| 16 | +- [ ] Используйте случайный сложный ключ (`JWT Secret`), чтобы сделать брут форс токена бесполезным. |
| 17 | +- [ ] Не полагайтесь на переданное в заголовках название алгоритма, лучше закрепите его константой на сервере (`HS256` или `RS256`). |
18 | 18 | - [ ] Сделайте срок действия токена (`TTL`, `RTTL`) как можно короче. |
19 | | -- [ ] Не храните конфиденциальные данные в полезной нагрузке JWT, ее можно [легко декодировать.](https://jwt.io/#debugger-io). |
| 19 | +- [ ] Не храните конфиденциальные данные в JWT, ее можно [легко декодировать.](https://jwt.io/#debugger-io). |
20 | 20 |
|
21 | 21 | ### OAuth |
22 | 22 | - [ ] Всегда проверяйте `redirect_uri` на стороне сервера, чтобы разрешать только URL-адреса с белыми списками. |
23 | | -- [ ] Всегда старайтесь обменивать код, а не токены (не разрешать `response_type=token`). |
24 | | -- [ ] Используйте параметр `состояния` со случайным хешем, чтобы предотвратить CSRF в процессе аутентификации OAuth. |
25 | | -- [ ] Определите область по умолчанию и проверьте параметры области для каждого приложения. |
| 23 | +- [ ] Всегда старайтесь обменивать временный код, а не токены (не использовать `response_type=token`). |
| 24 | +- [ ] Используйте параметр `state` со случайным хешем, чтобы предотвратить CSRF в процессе аутентификации OAuth. |
| 25 | +- [ ] Определите scope по умолчанию, а также проверяйте параметры для каждого приложения. |
26 | 26 |
|
27 | 27 | ## Доступ |
28 | | -- [ ] Ограничьте запросы (Throttling), чтобы избежать DDoS атак / грубой силы (Brute Force). |
| 28 | +- [ ] Установите ограничение на кол-во запросов в минуту (Throttling, RPS), чтобы избежать DDoS атак / грубой силы (Brute Force). |
29 | 29 | - [ ] Используйте HTTPS на стороне сервера, чтобы избежать MITM (Man In The Middle Attack / Атака посредника). |
30 | 30 | - [ ] Используйте заголовок `HSTS` (HTTP Strict Transport Security) с SSL, чтобы избежать атаки SSL Strip (перехват SSL соединений). |
31 | 31 |
|
32 | | -## Ввод |
33 | | -- [ ] Используйте соответствующий HTTP-метод в соответствии с операцией: `GET (чтение)`, `POST (создание)`, `PUT / PATCH (замена / обновление)` и `DELETE (для удаления записи)`, а также ответьте `405 Method Not Allowed`, если запрошенный метод не подходит для запрашиваемого ресурса. |
34 | | -- [ ] Подтвердите `тип содержимого` по запросу "Принять заголовок" (Консолидация контента), чтобы разрешить только поддерживаемый формат (например, `application/xml`, `application/json` и т.д.) И отвечайте с недопустимым ответом 406, если он не согласован. |
35 | | -- [ ] Проверяйте содержимое опубликованных данных `типа контента` по мере их принятия (например, `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json` и т.д.). |
| 32 | +## Запрос |
| 33 | +- [ ] Используйте соответствующий HTTP-метод в соответствии с операцией: `GET (чтение)`, `POST (создание)`, `PUT / PATCH (замена / обновление)` и `DELETE (удаление)`, а также ответьте `405 Method Not Allowed`, если запрошенный метод не подходит для запрашиваемого ресурса. |
| 34 | +- [ ] Проверяй тип данных в заголовоке `Accept`, чтобы разрешить только поддерживаемые форматы (например, `application/xml`, `application/json` и т.д.) И отвечайте `406 Not Acceptable`, если тип не поддерживается. |
| 35 | +- [ ] Проверяйте, сможете ли вы обработать тип получаемых данных (например, `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json` и т.д.). |
36 | 36 | - [ ] Проверьте пользовательский ввод во избежание распространенных уязвимостей (например: `XSS`, `SQL-инъекций`, `удаленное выполнение кода` и т.д.). |
37 | | -- [ ] Не используйте конфиденциальные данные (`учетные данные`, `пароли`, `маркеры безопасности` или `ключи API`) в URL-адресе, но используйте стандартный заголовок авторизации. |
38 | | -- [ ] Используйте службу шлюза API, чтобы активировать кеширование, ограничение скорости, спайк-арест и динамическое развертывание ресурсов API. |
| 37 | +- [ ] Не передавайте конфиденциальные данные (`учетные данные`, `пароли`, `токены` или `ключи API`) в URL-адресе, вместо него используйте стандартный заголовок `Authorization`. |
| 38 | +- [ ] Используйте единый API-шлюз, чтобы можно было настроить кеширование, ограничение на кол-во запросов, Spike Arrest, а также динамическое развертывание API. |
39 | 39 |
|
40 | 40 | ## Обработка |
41 | | -- [ ] Проверьте, защищены ли все конечные точки за аутентификацией, чтобы не нарушить процедуру проверки подлинности. |
42 | | -- [ ] Следует избегать идентификатора пользователя собственного ресурса. Используйте `/me/orders` вместо `/user/654321/orders`. |
43 | | -- [ ] Не включайте автоинкремент для ID. Вместо этого используйте `UUID`. |
44 | | -- [ ] Если вы разбираете XML-файлы, убедитесь, что синтаксический анализ сущностей не включен, чтобы избежать `атаки на внешний объект XML` (XML external entity). |
45 | | -- [ ] Если вы разбираете XML-файлы, убедитесь, что расширение сущности не включено, чтобы избежать `Billion Laughs / XML bomb` с помощью экспоненциальной атаки расширения сущностей. |
| 41 | +- [ ] Проверьте, защищены ли все точки входа аутентификацией, чтобы не нарушить процедуру проверки подлинности. |
| 42 | +- [ ] Следует избегать ID собственного ресурса. Используйте `/me/orders` вместо `/user/654321/orders`. |
| 43 | +- [ ] Не используйте автоинкремент для ID. Вместо этого используйте `UUID`. |
| 44 | +- [ ] Если вы разбираете XML-файлы, убедитесь, что парсинг сущностей выключен, чтобы избежать `XXE` (XML external entity). |
| 45 | +- [ ] Если вы разбираете XML-файлы, убедитесь, что расширение сущности выключено, чтобы избежать `Billion Laughs / XML bomb` через атаку экспоненциального расширения сущностей. |
46 | 46 | - [ ] Используйте CDN для загрузки файлов. |
47 | | -- [ ] Если вы имеете дело с огромным количеством данных, используйте Workers and Queues, чтобы обрабатывать как можно больше в фоновом режиме и быстро возвращать ответ, чтобы избежать блокировки HTTP. |
48 | | -- [ ] Не забудьте выключить режим DEBUG. |
| 47 | +- [ ] Если вы имеете дело с огромным количеством данных, используйте Workers and Queues, чтобы обрабатывать как можно больше в фоновом режиме и быстро возвращать ответ, чтобы избежать блокирования HTTP. |
| 48 | +- [ ] Не забудьте выключить режим отладки (debug). |
49 | 49 |
|
50 | | -## Вывод |
| 50 | +## Ответ |
51 | 51 | - [ ] Отправляйте заголовок `X-Content-Type-Options: nosniff`. |
52 | 52 | - [ ] Отправляйте заголовок `X-Frame-Options: deny`. |
53 | 53 | - [ ] Отправляйте заголовок `Content-Security-Policy: default-src 'none'`. |
54 | | -- [ ] Удалите заголовки отпечатков пальцев - `X-Powered-By`, `Server`, `X-AspNet-Version` и т.д. |
55 | | -- [ ] Принудите `тип содержимого` для вашего ответа, если вы вернете `application/json`, тогда ваш тип содержимого ответа будет `application/json`. |
56 | | -- [ ] Не возвращайте конфиденциальные данные, такие как `учетные данные`, `пароли`, `токены безопасности`. |
57 | | -- [ ] Возвращайте код состояния в соответствии с завершенной работой. (Например: `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` и т.д.). |
| 54 | +- [ ] Удалите заголовки, которые могут помочь злоумышленнику в исследовании вашего ресурса на уязвимости - `X-Powered-By`, `Server`, `X-AspNet-Version` и т.д. |
| 55 | +- [ ] Зафиксируйте `Content-Type` для вашего ответа, если вы возвращаете `application/json`, тогда запрос должен быть в `application/json`. |
| 56 | +- [ ] Не возвращайте конфиденциальные данные, такие как `учетные данные`, `пароли`, `токены`. |
| 57 | +- [ ] Возвращайте код состояния в соответствии с итогами обработки. (Например: `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` и т.д.). |
58 | 58 |
|
59 | 59 | ## Непрерывная интеграция и Непрерывная доставка (CI & CD) |
60 | | -- [ ] Аудит вашего дизайна и реализации с охватом модулей/интеграционных тестов. |
61 | | -- [ ] Используйте процесс проверки кода и игнорируйте самоокупаемость. |
62 | | -- [ ] Убедитесь, что все компоненты ваших служб статически сканируются с помощью антивирусов перед отправкой на производство, включая библиотеки поставщиков и другие зависимости. |
63 | | -- [ ] Создайте решение отката для развертывания. |
| 60 | +- [ ] Проверяйте ваш проект во время CI/CD. Покрывайте код unit/интеграционными тестами. |
| 61 | +- [ ] Используйте процесс проверки кода (Code Review) коллегами. Не апрувьте сами себя (no Self-Approval). |
| 62 | +- [ ] Убедитесь, что ваше приложение сканируются с помощью антивирусов перед отправкой в прод, включая библиотеки и другие зависимости. |
| 63 | +- [ ] Сделайте возможным быстрый откат на предыдущую версию. |
64 | 64 |
|
65 | 65 |
|
66 | 66 | --- |
|
0 commit comments