|
| 1 | +[繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [Azərbaycan](./README-az.md) | [বাংলা](./README-bn.md) | [Català](./README-ca.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ພາສາລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) | [Български](./README-bg.md) |
| 2 | + |
| 3 | +# Контролен списък за сигурност на API |
| 4 | + |
| 5 | +Контролен списък с най-важните контрамерки за сигурност при проектиране, тестване и пускане на вашето API. |
| 6 | + |
| 7 | +--- |
| 8 | + |
| 9 | +## Удостоверяване |
| 10 | + |
| 11 | +- [ ] Не използвайте `Basic Auth`. Използвайте стандартно удостоверяване ( например: [JWT](https://jwt.io/), OAuth). |
| 12 | +- [ ] Не преоткривайте нови начини за `удостоверяване`, `генериране на токени`, `съхранение на пароли`. Придържайте се към стандартите. |
| 13 | +- [ ] Използвайте `Max Retry` и jail функции по време на удостоверяване. |
| 14 | +- [ ] Използвайте криптиране на всички чувствителни данни. |
| 15 | + |
| 16 | +### JWT (JSON Web Token) |
| 17 | + |
| 18 | +- [ ] Използвайте произволен сложен ключ (`JWT Secret`), за да направите грубото форсиране на токена по- трудно. |
| 19 | +- [ ] Не извличайте алгоритъма от заглавката. Принудете алгоритъма в бекенда (`HS256` or `RS256`). |
| 20 | +- [ ] Направете токена, така че да изтече (`TTL`, `RTTL`), за възможно най-кратко време. |
| 21 | +- [ ] Не съхранявайте чувствителни данни в JWT, те могат да бъдат декодирани [лесно](https://jwt.io/#debugger-io). |
| 22 | +- [ ] Избягвайте да съхранявате твърде много данни. JWT обикновено се споделя в заглавки, а те имат ограничение на размера. |
| 23 | + |
| 24 | +## Достъп |
| 25 | + |
| 26 | +- [ ] Задайте ограничение за броя на заявките в минута (Throttling, RPM-Limit), за да избегнете DDoS / Brute Force атаки. |
| 27 | +- [ ] Използвайте HTTPS, от страната на сървъра, с TLS 1.2+ и сигурни шифри, за да избегнете MITM (Man in the Middle атака). |
| 28 | +- [ ] Използвайте заглавката `HSTS` (HTTP Strict Transport Security) със SSL, за да избегнете SSL Strip атаки. |
| 29 | +- [ ] Изключете списъците с директории. |
| 30 | +- [ ] За частни API, разрешете достъп само от IP адреси/хостове в белия списък. |
| 31 | + |
| 32 | +## Упълномощаване |
| 33 | + |
| 34 | +### OAuth |
| 35 | + |
| 36 | +- [ ] Винаги проверявайте `redirect_uri`, от страната на сървъра, за да разрешите само URL адреси от белия списък. |
| 37 | +- [ ] Винаги се опитвайте да използвате еднократен код вместо токени (не използвайте `response_type=token`). |
| 38 | +- [ ] Използвайте параметъра `state` с произволен хеш, за да предотвратите CSRF в процеса на OAuth удостоверяване. |
| 39 | +- [ ] Определете обхват по подразбиране и проверете настройките за всяко приложение. |
| 40 | + |
| 41 | +## Заявка |
| 42 | + |
| 43 | +- [ ] Използвайте подходящият HTTP метод според операцията: `GET (четене)`, `POST (създаване)`, `PUT/PATCH (замяна/актуализация)` и `DELETE (изтриване)` и също отговорете с `405 Method Not Allowed` ако заявеният метод не е подходящ за искания ресурс. |
| 44 | +- [ ] Валидирайте `типа данни (content-type)` в заглавката `Accept` (Content Negotiation), за да позволите само поддържани формати (например: `application/xml`, `application/json` и т.н.) и отговорете с `406 Not Acceptable`, ако типът не се поддържа. |
| 45 | +- [ ] Валидирайте `типа данни (content-type)`, които получавате (например: `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json` и т.н.). |
| 46 | +- [ ] Валидирайте въведеното от потребителя, за да избегнете често срещани уязвимости (например: `XSS`, `SQL-Injection`, `Remote Code Execution`и т.н.). |
| 47 | +- [ ] Не споделяйте чувствителни данни (`идентификационни данни`, `пароли`, `токени` или `API ключове`) в URL адреса, вместо това използвайте стандартната заглавка `Authorization`. |
| 48 | +- [ ] Използвайте само криптиране от страна на сървъра. |
| 49 | +- [ ] Използвайте API шлюз за да конфигурирате кеширане, ограничаване на заявките (например: `Quota`, `Spike Arrest` или `Concurrent Rate Limit`) и динамично внедряване на API. |
| 50 | + |
| 51 | +## Обработка |
| 52 | + |
| 53 | +- [ ] Проверете, дали всички крайни точки са защитени чрез удостоверяване, за да избегнете прекъсване на процеса на удостоверяване. |
| 54 | +- [ ] Идентификаторът на собствен ресурс на потребителя, трябва да се избягва. Използвайте `/me/orders`, вместо `/user/654321/orders` |
| 55 | +- [ ] Не използвайте автоматично нарастване за ID. Вместо това използвайте `UUID`. |
| 56 | +- [ ] Ако анализирате XML файлове, уверете се, че анализът на обект е изключен, за да избегнете `XXE` (XML external entity). |
| 57 | +- [ ] Ако анализирате XML, YAML или друг език с котви и препратки, уверете се, че разширяването на обекта е изключено, за да избегнете `Billion Laughs/XML bomb` чрез атака с експоненциално разширяване на обект. |
| 58 | +- [ ] Използвайте CDN за качване на файлове. |
| 59 | +- [ ] Ако имате работа с огромно количество данни, използвайте Workers и Queues, за да обработите колкото е възможно повече, във фонов режим, и да върнете отговор бързо, за да избегнете HTTP блокиране. |
| 60 | +- [ ] Не забравяйте да изключите режима DEBUG. |
| 61 | +- [ ] Използвайте неизпълними стекове, когато има такива. |
| 62 | + |
| 63 | +## Отговор |
| 64 | + |
| 65 | +- [ ] Изпратете заглавката `X-Content-Type-Options: nosniff`. |
| 66 | +- [ ] Изпратете заглавката `X-Frame-Options: deny`. |
| 67 | +- [ ] Изпратете заглавката `Content-Security-Policy: default-src 'none'`. |
| 68 | +- [ ] Премахнете заглавките, които биха могли да помогнат на атакуващ да провери вашия ресурс за уязвимости - `X-Powered-By`, `Server`, `X-AspNet-Version`и т.н. |
| 69 | +- [ ] Фиксирайте `content-type` за вашия отговор. Ако изпращате отговор `application/json`, то тогава заявката трябва да бъде в `application/json` |
| 70 | +- [ ] Не изпращайте в отговорите чувствителни данни като `идентификационни данни`, `пароли` или `токени`. |
| 71 | +- [ ] Върнете правилния код на състоянието въз основа на резултатите от операцията. (например: `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` и т.н.). |
| 72 | + |
| 73 | +## Непрекъсната интеграция и непрекъсната доставка (CI & CD) |
| 74 | + |
| 75 | +- [ ] Одитирайте вашия дизайн и внедрете модулни/интеграционни тестове. |
| 76 | +- [ ] Използвайте процес за преглед на кода (Code Review). Не се самоодобрявайте (no Self-Approval). |
| 77 | +- [ ] Уверете се, че вашето приложение е сканирано с антивирусен софтуер, преди да бъде пуснато в производство, включително библиотеки и други зависимости. |
| 78 | +- [ ] Непрекъснато провеждайте тестове за сигурност (статичен/динамичен анализ) на вашия код. |
| 79 | +- [ ] Проверете вашите зависимости (както софтуер, така и операционна система) за известни уязвимости. |
| 80 | +- [ ] Проектирайте решение за бързо връщане към предишната версия. |
| 81 | + |
| 82 | +## Мониторинг |
| 83 | + |
| 84 | +- [ ] Използвайте централизирани входове за всички услуги и компоненти. |
| 85 | +- [ ] Използвайте агенти, за да наблюдавате целия трафик, грешки, заявки и отговори. |
| 86 | +- [ ] Използвайте известия за SMS, Slack, имейл, Telegram, Kibana, Cloudwatch и др. |
| 87 | +- [ ] Уверете се, че не регистрирате чувствителни данни като кредитни карти, пароли, ПИН кодове и др. |
| 88 | +- [ ] Използвайте IDS и/или IPS система за наблюдение на заявки и екземпляри на API. |
| 89 | + |
| 90 | +--- |
| 91 | + |
| 92 | +## Вижте също: |
| 93 | + |
| 94 | +- [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Колекция от полезни ресурси за създаване на RESTful HTTP+JSON API. |
| 95 | + |
| 96 | +--- |
| 97 | + |
| 98 | +# Принос |
| 99 | + |
| 100 | +Чувствайте се свободни да допринесете, като отворите това хранилище, направите някои промени и изпратите `Pull Requests`. За всякакви въпроси, моля, пишете ни на `[email protected]`. |
0 commit comments