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), за да направите грубото форсиране на токена по- трудно. - Не извличайте алгоритъма от заглавката. Принудете алгоритъма в бекенда (
HS256orRS256). - Направете токена, така че да изтече (
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. За всякакви въпроси, моля, пишете ни на team@shieldfy.io.