|
| 1 | +# Lista kontrolna bezpieczeństwa API |
| 2 | +Lista kontrolna najważniejszych metod zabezpieczenia podczas projektowania, testowania oraz wypuszczania własnego API. |
| 3 | + |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | + |
| 8 | +## Uwierzytelnianie |
| 9 | +- [ ] Nie używaj `Basic Auth`. Użyj standardów uwierzytelniania (np. [JWT](https://jwt.io/), [OAuth](https://oauth.net/)). |
| 10 | +- [ ] Nie wynajduj koła na nowo podczas `Uwierzytelniania`, `generowanie tokenów`, `przechowywania haseł`. Użyj sprawdzonych standardów. |
| 11 | +- [ ] Dodaj `Maksymalną ilość prób` oraz inne opcje ograniczające podczas Logowania. |
| 12 | +- [ ] Szyfruj wszystkie wrażliwe (ważne) dane. |
| 13 | + |
| 14 | +### JWT (JSON Web Token) |
| 15 | +- [ ] Użyj losowego, skomplikowanego klucza (`JWT Secret`) aby uczynić token bezpieczniejszym przeciw atakom typu `brute force`. |
| 16 | +- [ ] Algorytmy trzymaj w backendzie, nie upubliczniaj algorytmów. |
| 17 | +- [ ] Ustaw wygaszanie tokenów (`TTL`, `RTTL`) najkrótsze jak to możliwe. |
| 18 | +- [ ] Nie przechowuj wrażliwych danych w `JWT payload`, mogą był łatwo dekodowane przy pomocy [easily](https://jwt.io/#debugger-io). |
| 19 | + |
| 20 | +### OAuth |
| 21 | +- [ ] Zawsze waliduj `redirect_uri` po stronie serwera aby zezwolić tylko URL-om z dozwolonej listy (`whitelist`). |
| 22 | +- [ ] Zawsze próbuj wymienić kodem nie tokenami (nie zezwalaj na `response_type=token`). |
| 23 | +- [ ] Użyj parametru `state` z losowym hashem aby zabezpieczyć proces OAuth przed atakiem CSRF. |
| 24 | +- [ ] Zdefiniuj oraz waliduj zakres parametrów dla każdej aplikacji. |
| 25 | + |
| 26 | +## Dostęp |
| 27 | +- [ ] Ustaw limit zapytań (Throttling) aby uniknąć ataku DDoS / brute-force. |
| 28 | +- [ ] Użyj HTTPS aby uniknąć MITM (Man In The Middle Attack) - ataku polegającego na pośrednictwie w wymianie informacji pomiędzy dwoma punktami np. klientem i serwerem. |
| 29 | +- [ ] Użyj nagłówka `HSTS` z SSL aby uniknąć SSL Strip attack. |
| 30 | + |
| 31 | + |
| 32 | +## Wejście |
| 33 | +- [ ] Użyj odpowiedniej metody protokołu HTTP dla danej operacji: `GET (odczyt)`, `POST (tworzenie)`, `PUT/PATCH (zmiana)`, and `DELETE (usuwanie)`, i odpowiadaj `405 Method Not Allowed` jeżeli metoda zapytania jest niepoprawna. |
| 34 | +- [ ] Waliduj `content-type` podczas zapytań i zezwalaj jedynie na wymagane typy danych (np. `application/xml`, `application/json`) oraz odpowiadaj `406 Not Acceptable` jeżeli nie pasują. |
| 35 | +- [ ] Waliduj `content-type` informacji przekazywanych metodą POST (np. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`). |
| 36 | +- [ ] Waliduj informacje wprowadzane przez użytkownika, aby uniknąć zagrożeń (np.. `XSS`, `SQL-Injection`, `Zdalne Wykonanie Skryptu`). |
| 37 | +- [ ] Nie używaj żadnych wrażliwych danych w URL, zamiast tego użyj standardowego nagłówka Autoryzującego. |
| 38 | +- [ ] Użyj usługi API Gateway aby włączyć caching oraz np. `Quota`, `Spike Arrest`, `Concurrent Rate Limit`. |
| 39 | + |
| 40 | + |
| 41 | +## Przetwarzanie |
| 42 | +- [ ] Sprawdź czy wszystkie endpointy są zabezpieczone uwierzytelnianiem aby uniknąć niautoryzowanego dostępu. |
| 43 | +- [ ] Unikaj ukazywania ID użytkownika. Użyj np. `/me/orders` zamiast `/users/654321/orders/`. |
| 44 | +- [ ] Nie używaj auto inkrementacji w polu ID. Zamiast tego użyj `UUID`. |
| 45 | +- [ ] Jeżeli parsujesz pliki XML, upewnij się, że jesteś odporny na `XXE` (XML external entity attack) oraz `Billion Laughs/XML bomb`. |
| 46 | +- [ ] Użyj CDN do przechowywania wysyłanych plików. |
| 47 | +- [ ] Jeżeli pracujesz z dużą ilością danych, użyj procesów Workers oraz kolejkowania Queues aby przetworzyć jak najwięcej w tle i zwrócić informacje szybko aby uniknąć blokowania HTTP. |
| 48 | +- [ ] Nie zapomnij o wyłączeniu trybu debugowania. |
| 49 | + |
| 50 | +## Wyjście |
| 51 | +- [ ] Wyślij nagłówek `X-Content-Type-Options: nosniff`. |
| 52 | +- [ ] Wyślij nagłówek `X-Frame-Options: deny`. |
| 53 | +- [ ] Wyślij nagłówek `Content-Security-Policy: default-src 'none'`. |
| 54 | +- [ ] Usuń nagłówki cyfrowego odcisku palca (digital fingerprint) - `X-Powered-By`, `Server`, `X-AspNet-Version`. |
| 55 | +- [ ] Wymuś `content-type` podczas zwracania danych. Jeżeli zwracasz `application/json` wtedy twój `content-type` to `application/json`. |
| 56 | +- [ ] Nie zwracaj ważnych informacji jak `dane uwierzytelniające`, `hasła`, `tokeny bezpieczeństwa`. |
| 57 | +- [ ] Zwróc odpowiedni status w zależności od operacji. (np. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`). |
| 58 | + |
| 59 | +## CI & CD |
| 60 | +- [ ] Przetestuj wszystkie rozwiązania stosując testy jednostkowe. |
| 61 | +- [ ] Oddaj kod do przejrzenia innym, poddaj go `code review`. |
| 62 | +- [ ] Upewnij się, że wszystkie komponenty twojej usługi są skanowane przez oprogramowanie antywirusowe przed wejściem na produkcje. Uwzględnij także zewnętrzne biblioteki. |
| 63 | +- [ ] Stwórz możliwość szybkiego wycofania udostępnionego wdrożenia. |
| 64 | + |
| 65 | + |
| 66 | +--- |
| 67 | + |
| 68 | +## Zobacz także: |
| 69 | +- [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - [ENG] Zbiór wartościowych narzędzi do tworzenia REST HTTP+JSON API. |
0 commit comments