Sekrety i ochrona danych
Klucze, tokeny i dane osobowe to to, czego naprawdę szukają atakujący. Chroń je w spoczynku, w tranzycie i w historii źródeł.
Lista kontrolna
- Trzymaj sekrety poza kodem i klientem. Klucze API, hasła do baz danych i sekrety podpisywania należą do zmiennych środowiskowych lub menedżera sekretów. Nigdy nie wpisuj ich na sztywno i nigdy nie wysyłaj ich do przeglądarki. Narzędzia AI często wstawiają klucze bezpośrednio do kodu klienta, więc przeszukaj swój bundle pod kątem wszystkiego, co wygląda jak klucz.
- Trzymaj sekrety poza git. Dodaj
.env,*.pemi*.keydo.gitignoreprzed pierwszym commitem. Wszystko, co kiedykolwiek zostało zatwierdzone, jest skompromitowane, nawet jeśli później to usunięto, bo pozostaje w historii. Zrotuj taki sekret. - Szyfruj wrażliwe dane w spoczynku. Używaj szyfrowania uwierzytelnionego (AES-256-GCM) dla przechowywanych sekretów i wrażliwych treści użytkowników, z kluczem przechowywanym poza bazą danych.
- Obsługuj wszystko przez TLS. Brak jawnego HTTP dla czegokolwiek, co niesie poświadczenia lub dane osobowe. Przekieruj HTTP na HTTPS i ustaw HSTS.
- Nie umieszczaj sekretów ani danych osobowych w adresach URL. Parametry zapytania trafiają do logów, historii przeglądarki i nagłówka Referer. Umieszczaj je w ciele żądania.
- Zwracaj minimum. Endpoint profilu lub "me" powinien zwracać tylko to, czego potrzebuje interfejs, nigdy hashy haseł, kluczy ani wewnętrznych flag.
- Tam, gdzie to możliwe, przechowuj tokeny poza zasięgiem skryptów. JWT w
localStoragejest czytelny dla każdego skryptu, więc XSS go ukradnie. Ciasteczko httpOnly tego unika, kosztem konieczności obsługi CSRF. W każdym przypadku ścisła Content-Security-Policy jest zabezpieczeniem awaryjnym. Zobacz infrastrukturę. - Wspieraj prawa do danych. Pozwól użytkownikom eksportować i usuwać swoje dane oraz czyść je według harmonogramu. To dobra praktyka, a dla wielu organizacji wymóg prawny.
Jak testować
- Otwórz kartę sieci w narzędziach deweloperskich przeglądarki oraz bundle JS i szukaj
sk-,eyJ,password,secret,key. - Przeskanuj repozytorium i jego historię skanerem sekretów.
- Wywołaj swój endpoint "me" i przeczytaj każde zwrócone pole.