English | 繁中版 | 简中版 | العربية | Azərbaycan | বাংলা | Català | Čeština | Deutsch | Ελληνικά | Español | فارسی | Français | हिंदी | Indonesia | Italiano | 日本語 | 한국어 | ພາສາລາວ | Македонски | മലയാളം | Монгол | Nederlands | Polski | Português (Brasil) | Русский | ไทย | Türkçe | Українська | Tiếng Việt
Контролен списък с най-важните контрамерки за сигурност при проектиране, тестване и пускане на вашето API.
- Не използвайте
Basic Auth
. Използвайте стандартно удостоверяване ( например: JWT, OAuth). - Не преоткривайте нови начини за
удостоверяване
,генериране на токени
,съхранение на пароли
. Придържайте се към стандартите. - Използвайте
Max Retry
и jail функции по време на удостоверяване. - Използвайте криптиране на всички чувствителни данни.
- Използвайте произволен сложен ключ (
JWT Secret
), за да направите грубото форсиране на токена по- трудно. - Не извличайте алгоритъма от заглавката. Принудете алгоритъма в бекенда (
HS256
orRS256
). - Направете токена, така че да изтече (
TTL
,RTTL
), за възможно най-кратко време. - Не съхранявайте чувствителни данни в JWT, те могат да бъдат декодирани лесно.
- Избягвайте да съхранявате твърде много данни. JWT обикновено се споделя в заглавки, а те имат ограничение на размера.
- Задайте ограничение за броя на заявките в минута (Throttling, RPM-Limit), за да избегнете DDoS / Brute Force атаки.
- Използвайте HTTPS, от страната на сървъра, с TLS 1.2+ и сигурни шифри, за да избегнете MITM (Man in the Middle атака).
- Използвайте заглавката
HSTS
(HTTP Strict Transport Security) със SSL, за да избегнете SSL Strip атаки. - Изключете списъците с директории.
- За частни API, разрешете достъп само от IP адреси/хостове в белия списък.
- Винаги проверявайте
redirect_uri
, от страната на сървъра, за да разрешите само URL адреси от белия списък. - Винаги се опитвайте да използвате еднократен код вместо токени (не използвайте
response_type=token
). - Използвайте параметъра
state
с произволен хеш, за да предотвратите CSRF в процеса на OAuth удостоверяване. - Определете обхват по подразбиране и проверете настройките за всяко приложение.
- Използвайте подходящият HTTP метод според операцията:
GET (четене)
,POST (създаване)
,PUT/PATCH (замяна/актуализация)
иDELETE (изтриване)
и също отговорете с405 Method Not Allowed
ако заявеният метод не е подходящ за искания ресурс. - Валидирайте
типа данни (content-type)
в заглавкатаAccept
(Content Negotiation), за да позволите само поддържани формати (например:application/xml
,application/json
и т.н.) и отговорете с406 Not Acceptable
, ако типът не се поддържа. - Валидирайте
типа данни (content-type)
, които получавате (например:application/x-www-form-urlencoded
,multipart/form-data
,application/json
и т.н.). - Валидирайте въведеното от потребителя, за да избегнете често срещани уязвимости (например:
XSS
,SQL-Injection
,Remote Code Execution
и т.н.). - Не споделяйте чувствителни данни (
идентификационни данни
,пароли
,токени
илиAPI ключове
) в URL адреса, вместо това използвайте стандартната заглавкаAuthorization
. - Използвайте само криптиране от страна на сървъра.
- Използвайте API шлюз за да конфигурирате кеширане, ограничаване на заявките (например:
Quota
,Spike Arrest
илиConcurrent Rate Limit
) и динамично внедряване на API.
- Проверете, дали всички крайни точки са защитени чрез удостоверяване, за да избегнете прекъсване на процеса на удостоверяване.
- Идентификаторът на собствен ресурс на потребителя, трябва да се избягва. Използвайте
/me/orders
, вместо/user/654321/orders
- Не използвайте автоматично нарастване за ID. Вместо това използвайте
UUID
. - Ако анализирате XML файлове, уверете се, че анализът на обект е изключен, за да избегнете
XXE
(XML external entity). - Ако анализирате XML, YAML или друг език с котви и препратки, уверете се, че разширяването на обекта е изключено, за да избегнете
Billion Laughs/XML bomb
чрез атака с експоненциално разширяване на обект. - Използвайте CDN за качване на файлове.
- Ако имате работа с огромно количество данни, използвайте Workers и Queues, за да обработите колкото е възможно повече, във фонов режим, и да върнете отговор бързо, за да избегнете HTTP блокиране.
- Не забравяйте да изключите режима DEBUG.
- Използвайте неизпълними стекове, когато има такива.
- Изпратете заглавката
X-Content-Type-Options: nosniff
. - Изпратете заглавката
X-Frame-Options: deny
. - Изпратете заглавката
Content-Security-Policy: default-src 'none'
. - Премахнете заглавките, които биха могли да помогнат на атакуващ да провери вашия ресурс за уязвимости -
X-Powered-By
,Server
,X-AspNet-Version
и т.н. - Фиксирайте
content-type
за вашия отговор. Ако изпращате отговорapplication/json
, то тогава заявката трябва да бъде вapplication/json
- Не изпращайте в отговорите чувствителни данни като
идентификационни данни
,пароли
илитокени
. - Върнете правилния код на състоянието въз основа на резултатите от операцията. (например:
200 OK
,400 Bad Request
,401 Unauthorized
,405 Method Not Allowed
и т.н.).
- Одитирайте вашия дизайн и внедрете модулни/интеграционни тестове.
- Използвайте процес за преглед на кода (Code Review). Не се самоодобрявайте (no Self-Approval).
- Уверете се, че вашето приложение е сканирано с антивирусен софтуер, преди да бъде пуснато в производство, включително библиотеки и други зависимости.
- Непрекъснато провеждайте тестове за сигурност (статичен/динамичен анализ) на вашия код.
- Проверете вашите зависимости (както софтуер, така и операционна система) за известни уязвимости.
- Проектирайте решение за бързо връщане към предишната версия.
- Използвайте централизирани входове за всички услуги и компоненти.
- Използвайте агенти, за да наблюдавате целия трафик, грешки, заявки и отговори.
- Използвайте известия за SMS, Slack, имейл, Telegram, Kibana, Cloudwatch и др.
- Уверете се, че не регистрирате чувствителни данни като кредитни карти, пароли, ПИН кодове и др.
- Използвайте IDS и/или IPS система за наблюдение на заявки и екземпляри на API.
- yosriady/api-development-tools - Колекция от полезни ресурси за създаване на RESTful HTTP+JSON API.
Чувствайте се свободни да допринесете, като отворите това хранилище, направите някои промени и изпратите Pull Requests
. За всякакви въпроси, моля, пишете ни на [email protected]
.