
Lista kontrolna bezpieczeństwa SaaS przed premierą: 40 sprawdzeń, które wykonujemy jako pierwsze (2026)
Lista kontrolna bezpieczeństwa SaaS przed premierą jest warta więcej niż stos odznak zgodności, których jeszcze nie posiadasz. Oto niewygodna prawda: większość list kontrolnych przed startem mówi Ci, co należy zabezpieczyć, ale nigdy nie pokazuje, jak to zrobić. Ta dostarcza gotowy kod. Budujemy w oparciu o Next.js i Supabase, widzieliśmy, jak jeden brakujący filtr tenant_id pozwolił kontu testowemu odczytać dane innego klienta, a raport IBM Cost of a Data Breach z 2024 roku szacuje globalny średni koszt wycieku danych na 4,88 mln USD. Nie potrzebujesz certyfikatu SOC 2, aby wystartować. Potrzebujesz poniższej bazy warstwy aplikacyjnej, pogrupowanej, gotowej do uruchomienia i odwzorowanej na wytyczne OWASP oraz NIST.
Kluczowe wnioski
- Nie potrzebujesz SOC 2 ani testów penetracyjnych, aby wystartować. Potrzebujesz poniższej bazy warstwy aplikacyjnej.
- Najbardziej niebezpiecznym błędem przy starcie jest wyciek danych między tenantami spowodowany brakiem sprawdzenia
tenant_id. - Nigdy nie pisz własnego systemu uwierzytelniania. Użyj Auth.js, Clerk lub Supabase Auth.
- Przeprowadź audyt prefiksów
NEXT_PUBLIC_przed wdrożeniem. To najszybszy sposób na wyciek sekretu.
Ta baza odnosi się do OWASP ASVS 5.0 oraz NIST Secure Software Development Framework (SSDF) – dwóch referencji, którym Google najbardziej ufa w tym temacie i, co istotne, dwóch, których żaden z najlepiej rankingowanych przewodników nawet nie cytuję.
Twoja przedpremierowa lista kontrolna bezpieczeństwa (Wersja szybka)
Są to minimalne wymagania bezpieczeństwa przed wypuszczeniem produktu, podzielone na sześć kategorii. Czterdzieści punktów. Wykonaj je po kolei, przekaż sekcje kodu swojemu programiście i traktuj wszystko oznaczone jako P0 w poniższej tabeli priorytetów jako bloker premiery.
Sekrety i konfiguracja
.envznajduje się w.gitignoreod pierwszego commita i nigdy nie zostało zatwierdzone do repozytorium.- Każdy prefiks
NEXT_PUBLIC_iVITE_został poddany audytowi; żadne sekrety nie trafiają do przeglądarki. - Sekrety serwera przechowywane są w menedżerze (zmienne środowiskowe platformy, AWS Secrets Manager, Vault), a nie w repozytorium.
- Każdy klucz, który kiedykolwiek trafił do historii gita, jest rotowany przed premierą.
- Żadne sekrety nie pojawiają się w logach, payloadach błędów ani w bundlu klienckim.
- Przeszukałeś zbudowany bundle pod kątem aktywnych kluczy (
grep -r "sk_live" .next/).
Uwierzytelnianie i dostęp
- Uwierzytelnianie oparte jest na bibliotece (Auth.js, Clerk lub Supabase Auth), a nie pisane ręcznie.
- MFA (uwierzytelnianie wieloskładnikowe) jest dostępne dla kont.
- Ciasteczka sesyjne mają ustawione flagi
Secure,HttpOnlyiSameSite. - Tokeny JWT ani tokeny sesji nie są przechowywane w
localStorage. - RBAC (kontrola dostępu oparta na rolach) i zasady najmniejszych uprawnień są wymuszane po stronie serwera, a nie tylko ukrywane w interfejsie użytkownika.
- Hasła są hashowane za pomocą Argon2 lub bcrypt (tylko jeśli samodzielnie zarządzasz uwierzytelnianiem).
- Procesy resetowania hasła i weryfikacji e-maila są testowane pod kątem nadużyć.
Dane i tenancy (wielodostępność)
- Każde zapytanie zawiera filtr
tenant_id. - Zakres tenantów jest wymuszany na warstwie ORM lub repozytorium, a nie pamiętany przy każdym zapytaniu.
- Bezpieczeństwo na poziomie wierszy (Row-Level Security) jest włączone, a jego tryby awarii są zrozumiane.
- Każdy endpoint oparty na ID obiektu przeprowadza sprawdzenie własności (to eliminuje IDOR).
tenant_idjest uwzględniany w kluczach cache oraz ścieżkach storage'u obiektowego.- Dane są szyfrowane w spoczynku i w tranzycie.
- Podpisy płatności i webhooków (Stripe itp.) są weryfikowane po stronie serwera.
Zależności i łańcuch dostaw
npm auditlubpnpm auditjest czyste z błędów wysokich i krytycznych (lub jawnie przeanalizowanych).- Dependabot lub Renovate są włączone.
- Snyk lub Socket przeprowadzają głębszą analizę SCA oraz sprawdzają malware i licencje.
- Plik lockfile jest commitowany do repozytorium.
- W krytycznej ścieżce nie ma porzuconych ani nieutrzymywanych pakietów.
- Obrazy kontenerowe są skanowane, jeśli używasz Dockera.
Sieć i transport
- HTTPS jest wymuszony wszędzie, z preloadem HSTS.
- Polityka Content-Security-Policy jest ustawiona (najpierw tryb report-only, potem enforce).
- Ustawiono
X-Content-Type-Options: nosnifforazX-Frame-Options/frame-ancestors. - Ustawiono
Referrer-PolicyiPermissions-Policy. - CORS używa białej listy, nigdy
*z danymi uwierzytelniającymi (credentials). - Limitowanie szybkości (rate limiting) chroni endpointy uwierzytelniania i te kosztowne obliczeniowo.
- Każdy endpoint waliduje dane wejściowe za pomocą schematu (Zod lub podobny).
Monitoring i reagowanie
- Scentralizowane logi audytu rejestrują, kto uzyskał dostęp do czego i kiedy.
- Obsługa błędów nigdy nie ujawnia stack trace'ów użytkownikom.
- Alerty uruchamiają się przy anomaliach uwierzytelniania (skoki nieudanych logowań, niemożliwe podróże).
- Automatyczne kopie zapasowe działają, a przywracanie zostało przetestowane.
- Istnieje kontakt do reakcji na incydenty oraz jednostronicowa instrukcja postępowania (runbook).
- Monitoring uptime i błędów (Sentry lub odpowiednik) jest aktywny.
- Znasz wyzwalacz do zaangażowania testów penetracyjnych.
Priorytety naprawcze
Nie każdy element blokuje premierę. Ta tabela triażu sortuje bazę według szkód wynikających z pominięcia, aby founder wiedział, co jest nie do negocjacji. P0 = napraw przed premierą, P1 = napraw w pierwszym tygodniu, P2 = napraw w ciągu kwartału.
| Sprawdzenie | Kategoria | Jeśli to pominiesz | Wysiłek naprawy | Bloker premiery? |
|---|---|---|---|---|
| Izolacja między tenantami w każdym zapytaniu | Dane i tenancy | Jeden klient czyta dane drugiego | Średni | P0: blokuj premierę |
| Sekrety poza bundlem klienckim | Sekrety i konfiguracja | Publiczne klucze API, przejęcie konta | Niski | P0: blokuj premierę |
| Sprawdzenie własności na endpointach ID obiektu | Dane i tenancy | IDOR: inkrementacja ID wycieka rekordy | Niski | P0: blokuj premierę |
| Uwierzytelnianie na bibliotece, nie pisane ręcznie | Uwierzytelnianie i dostęp | Błędy w auth, zerwane sesje | Średni | P0: blokuj premierę |
| HTTPS i HSTS wszędzie | Sieć i transport | Kradzież tokenów w tranzycie | Niski | P0: blokuj premierę |
| npm audit czyste z błędów wysokich/krytycznych | Zależności | Znane CVE w zależności pośredniej | Niski | P1: pierwszy tydzień |
| Rate limiting na endpointach auth | Sieć i transport | Credential stuffing, brute force | Niski | P1: pierwszy tydzień |
| Nagłówki bezpieczeństwa (CSP, HSTS, nosniff) | Sieć i transport | XSS, clickjacking, ataki MIME | Niski | P1: pierwszy tydzień |
| Scentralizowane logi audytu | Monitoring | Nie możesz zobaczyć ani udowodnić naruszenia | Średni | P1: pierwszy tydzień |
| Przetestowane przywracanie kopii zapasowej | Monitoring | Kopia, której nie da się przywrócić, nic nie znaczy | Średni | P1: pierwszy tydzień |
| MFA dostępne dla kont | Uwierzytelnianie i dostęp | Łatwiejsze przejęcie konta | Niski | P2: ten kwartał |
| Pełne CSP wymuszone poza trybem report-only | Sieć i transport | Pozostałe powierzchnie ataku XSS | Średni | P2: ten kwartał |
Sekrety i konfiguracja: Czy jakieś klucze wyciekają do Twojego bundla klienckiego?
Higiena sekretów przy premierze oznacza, że żadne poświadczenia nigdy nie trafiają do przeglądarki. Prefiks NEXT_PUBLIC_ w Next.js (oraz VITE_ w Vite) wysyła wartość do każdego odwiedzającego, więc jeden błędny prefiks powoduje wyciek klucza. Trzymaj .env poza gitem, umieszczaj sekrety serwera w menedżerze i przeszukuj output buildu przed wdrożeniem.
Oto najczęstszy haczyk, który widzimy: NEXT_PUBLIC_ nie oznacza „publiczne informacje”. Oznacza „dosłownie wysyłam to do przeglądarki każdego odwiedzającego”. Dodaj ten prefiks do tajnego klucza Stripe lub klucza roli serwisowej, a będzie on żywy w bundlu dla każdego, kto otworzy DevTools.
# .env.local (the mistake)
NEXT_PUBLIC_STRIPE_SECRET=sk_live_51H... # BAD: ships to every browser
STRIPE_SECRET_KEY=sk_live_51H... # OK: server-only
# Public (safe to expose) vs server-only
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ... # anon key is meant to be public
SUPABASE_SERVICE_ROLE_KEY=eyJ... # never NEXT_PUBLIC_ this
# Catch a leaked key before you deploy
grep -r "sk_live" .next/ # any hit means a secret is in your client bundleReszta bazy dotyczącej sekretów jest nudna i niepodlegająca negocjacjom: .env w .gitignore od pierwszego commita, sekrety serwera w menedżerze zamiast w repozytorium oraz rotacja każdego klucza, który kiedykolwiek trafił do historii gita (usunięcie commita nie cofa wycieku). Wyciekły token wdrożeniowy to dokładnie tak zaczynają się naruszenia, takie jak incydent Vercel, dlatego traktuj każdy token tak, jakby już znajdował się na czyjejś liście obserwacyjnych.
Uwierzytelnianie i dostęp: Czy budować auth, czy użyć biblioteki?
Czy budować system uwierzytelniania, czy użyć biblioteki? Prawie zawsze używaj biblioteki. Auth.js, Clerk i Supabase Auth przyswoiły lata przypadków brzegowych, które w przeciwnym razie odkryjesz ponownie na produkcji: utrwalanie sesji, unieważnianie tokenów, nadużycia w procesie resetu. Pisanie własnego rozwiązania jest obronliwe tylko wtedy, gdy masz inżyniera bezpieczeństwa i powód, dla którego żaden dostawca nie pasuje, co jest rzadkie.
Pisanie własnego auth to najdroższy sposób na oszczędzenie 25 USD miesięcznie. Oto uczciwe porównanie opcji.
| Opcja | Najlepsza, gdy | MFA wbudowane | Domyślna sesja | Haczyk |
|---|---|---|---|---|
| Auth.js (NextAuth) | Chcesz darmowe, self-hosted, pełną kontrolę | Przez providerów/add-on'y | JWT lub baza danych | Sam odpowiadasz za każdy przypadek brzegowy bezpieczeństwa |
| Clerk | Chcesz MFA, UI i organizacje out-of-the-box | Tak | Zarządzana | Płatne plany skalują się z aktywnymi użytkownikami |
| Supabase Auth | Już używasz Supabase i Postgres RLS | Tak | JWT | Jakość polityk RLS zależy od Ciebie |
| Własne rozwiązanie | Masz inżyniera bezpieczeństwa i żaden dostawca nie pasuje | Budujesz sam | Budujesz sam | Większość błędów auth zaczyna się właśnie tutaj |
Dwa pułapki pogrążają zespoły, które wybierają bibliotekę, ale pomijają konfigurację. Po pierwsze, unieważnianie JWT jest naprawdę trudne, więc skradziony token pozostaje ważny aż do wygaśnięcia; utrzymuj krótki czas życia tokenów i preferuj sesje po stronie serwera dla wszystkiego, co jest wrażliwe. Po drugie, tokeny w localStorage można ukraść przez dowolny payload XSS, dlatego przechowuj sesje w ciasteczkach httpOnly z flagami Secure i SameSite. Wymuszaj RBAC na serwerze, a nie poprzez ukrywanie przycisków w UI.
Jeśli Twój SaaS zawiera funkcje AI lub LLM, traktuj dane wejściowe modelu również jako nieufną granicę uwierzytelniania. Zobacz nasz przewodnik po zapobieganiu wstrzykiwaniu promptów, ponieważ odblokowany asystent z dostępem do narzędzi to problem kontroli dostępu ubrany w okno czatu.
Dane i tenancy: Jak powstrzymać jednego tenant'a przed czytaniem danych drugiego?
Izolacja tenantów oznacza, że każde zapytanie, klucz cache i ścieżka storage'u są ograniczone do bieżącego tenant'a. Brakujący filtr tenant_id pozwala jednemu klientowi czytać dane drugiego – to najniebezpieczniejszy błąd przy premierze. Bezpieczeństwo na poziomie wierszy (Row-Level Security) pomaga, ale jest pasem bezpieczeństwa, a nie polem siłowym, dlatego dodaj też sprawdzenia własności na każdym endpoincie ID obiektu.
To sekcja, której żaden konkurent nie omawia jako kod, i to właśnie przez nią wycieki między tenantami przedostają się na produkcję. Naprawa zaczyna się od nieufania samemu ID. Ogranicz każdy odczyt do tenant'a wywołującego i wymuszaj to na warstwie danych, aby nikt nie musiał pamiętać o tym przy każdym zapytaniu.
// BAD: no tenant scope. Any valid id returns any tenant's row.
const order = await db.order.findFirst({ where: { id } });
// GOOD: scoped to the caller's tenant on every read.
const order = await db.order.findFirst({
where: { id, tenantId: session.tenantId },
});Powiązaną awarią jest IDOR (insecure direct object reference), który OWASP API Security Top 10 klasyfikuje jako API1: Broken Object Level Authorization. Konto testowe inkrementuje ID w URL i odczytuje rekord, którego nigdy nie powinno widzieć. Web Security Academy firmy PortSwigger zawiera pełny przewodnik, jak atakujący znajdują te luki. Naprawą jest jedno sprawdzenie własności.
// GET /api/invoices/1234, a test account increments the id
// and reads another tenant's invoice. Classic BOLA.
const invoice = await db.invoice.findUnique({ where: { id } });
// Fix: verify ownership before you return anything.
if (invoice.tenantId !== session.tenantId) {
return res.status(403).json({ error: "Forbidden" });
}Oto ramy, które utrzymują Cię w ryzach: każde IDOR to awaria izolacji tenantów, ale nie każda awaria izolacji tenantów to IDOR. Bezpieczeństwo na poziomie wierszy Postgresa łapie wiele z nich w bazie danych, ale ma tryby cichej awarii, które warto znać, zanim zaczniesz na nim polegać.
-- Postgres RLS: a seatbelt, not a force field.
alter table orders enable row level security;
create policy tenant_isolation on orders
using (tenant_id = current_setting('app.tenant_id')::uuid);
-- Silent-failure trap: forget to SET app.tenant_id on a pooled
-- connection and the policy reads the PREVIOUS request's tenant.Zanieczyszczenie puli połączeń, wycieki kontekstu async i zatrucie współdzielonego cache'u cicho pokonują RLS, dlatego OWASP Multi-Tenant Security Cheat Sheet mówi, aby prefixować klucze cache i ścieżki storage'u także tenant'em. Rozdział o kontroli dostępu w OWASP ASVS 5.0 oraz dokumentacja Supabase RLS to dwie referencje, które warto przeczytać w całości w tym kontekście.
Zależności i łańcuch dostaw: Co ukrywa się w Twoim node_modules?
Twoja aplikacja jest tak bezpieczna, jak jej najsłabsza zależność pośrednia. Uruchom npm audit lub pnpm audit w CI i przerywaj build przy znaleziskach wysokich lub krytycznych, zanim w ogóle wystartujesz. Dodaj Dependabot lub Renovate do automatycznych aktualizacji oraz Snyk lub Socket do głębszych sprawdzeń malware i licencji.
Pułapką jest uruchomienie audytu raz ręcznie, zobaczenie zielonego wyniku i nigdy więcej go nieuruchamianie. Podłącz go do CI, aby nowe CVE w pakiecie, którego nie dotykałeś, nadal blokowało merge.
# .github/workflows/ci.yml: block the merge on high/critical
- name: Audit dependencies
run: npm audit --audit-level=high # non-zero exit fails the jobDokumentacja npm audit omawia poziomy poważności i flagę --production, jeśli chcesz ignorować znalezione tylko w dev. Automatyczne skanowanie to absolutna podstawa; dla głębszej analizy statycznej, która wychwytuje code smelly i ścieżki iniekcji, pomijane przez skanery zależności, zobacz naszą recenzję SonarQube. Commituj swój lockfile, usuń pakiety, które nie miały release'u od lat, i skanuj obraz kontenera, jeśli wdrażasz Dockerem.
Sieć i transport: Jakich nagłówków bezpieczeństwa naprawdę potrzebuje SaaS?
Jakich nagłówków bezpieczeństwa potrzebuje SaaS? HTTPS plus HSTS i krótki zestaw nagłówków zamykają najłatwiejsze do wykorzystania luki. Dodaj Content-Security-Policy, białą listę CORS zamiast wildcarda oraz limity szybkości na endpointach auth i kosztownych operacjach. Waliduj każde dane wejściowe za pomocą schematu takiego jak Zod, aby złe payloady nigdy nie dotarły do Twojej logiki.
Nie potrzebujesz każdego wymyślonego nagłówka. Potrzebujesz tej krótkiej listy, a referencja MDN dotycząca nagłówków bezpieczeństwa wyjaśnia każdy z nich szczegółowo.
| Nagłówek | Zalecana wartość | Co zatrzymuje |
|---|---|---|
| Strict-Transport-Security | max-age=63072000; includeSubDomains; preload | Degradację protokołu, ataki SSL-strip |
| Content-Security-Policy | default-src 'self'; zacznij od report-only | XSS, wstrzykiwane skrypty, eksfiltrację danych |
| X-Content-Type-Options | nosniff | Sniffing MIME, który zamienia upload w skrypt |
| X-Frame-Options / frame-ancestors | DENY (lub frame-ancestors 'none') | Clickjacking przez ukryte iframy |
| Referrer-Policy | strict-origin-when-cross-origin | Wyciekanie pełnych URL-i (i tokenów w nich zawartych) |
| Permissions-Policy | camera=(), microphone=(), geolocation=() | Rogue skrypty dotykające API urządzenia |
Ustaw nagłówki raz, na edge, i dodaj rate limiter, aby skrypt nie mógł bruteforce'ować Twojej trasy logowania przez całą noc.
// next.config.js: security headers on every response
const securityHeaders = [
{ key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains; preload" },
{ key: "X-Content-Type-Options", value: "nosniff" },
{ key: "X-Frame-Options", value: "DENY" },
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
];
// Rate-limit auth routes (Upstash example)
const { success } = await ratelimit.limit(ip);
if (!success) return new Response("Too many requests", { status: 429 });Rozpocznij swoje CSP w trybie report-only, aby nie zepsuć własnej aplikacji, obserwuj raporty naruszeń przez kilka dni, a następnie przełącz na enforce. Ogranicz CORS do nazwanej białej listy i nigdy nie łącz * z danymi uwierzytelniającymi.
Monitoring i reagowanie: Jak dowiesz się, że doszło do naruszenia?
Nie możesz zareagować na coś, czego nie widzisz. Przed premierą podłącz scentralizowane logi audytu, alerty na anomalie uwierzytelniania, takie jak skoki nieudanych logowań, automatyczne kopie zapasowe z przetestowanym przywracaniem oraz jednostronicową instrukcję postępowania w przypadku incydentu. Nietestowana kopia zapasowa to nadzieja, a nie backup, a czas na napisanie runbooku jest teraz, a nie w trakcie incydentu.
Dane IBM wskazują, że średni czas na zidentyfikowanie i opanowanie naruszenia wynosi 258 dni, a nie możesz skrócić tej liczby, jeśli Twoje logi nie rejestrują, kto i do czego miał dostęp. Scentralizuj je, alertuj na istotne anomalie (skoki nieudanych logowań, logowania z niemożliwych lokalizacji, nagły wzrost eksportu) i upewnij się, że Twój handler błędów zwraca czysty komunikat zamiast stack trace'u, który mapuje Twoje wnętrze.
Nowoczesne wykrywanie naruszeń opiera się na monitorowaniu anomalii, a nie statycznych regułach; więcej na temat tego, jak to faktycznie działa, znajdziesz w naszym artykule o tym, jak AI zapobiega wyciekom danych. Jeśli chodzi o podstawy frameworka, NIST SSDF (SP 800-218) przedstawia praktyki reagowania i monitorowania prostym językiem. Przetestuj przywracanie przed premierą, a nie po zniknięciu bazy danych.
Co faktycznie znajdujemy, przeglądając nasze własne premiery
Gdy nasz zespół przeprowadza przedpremierowy przegląd bezpieczeństwa buildu, naszego lub klienta, dwa przeoczenia pojawiają się częściej niż inne. Po pierwsze: sekret wjeżdżający do przeglądarki przez prefiks NEXT_PUBLIC_, zazwyczaj klucz API strony trzeciej, który ktoś opatrzył prefiksem, aby zadziałało wywołanie po stronie klienta. Po drugie: co najmniej jeden endpoint bez zakresu tenant_id lub sprawdzenia własności.
Przeoczenie zakresu tenantów jest straszne, ponieważ aplikacja wygląda na działającą poprawnie. Każda strona się ładuje. Błąd ujawnia się dopiero, gdy ktoś zmieni ID w URL. Podczas jednego przeglądu GET /api/orders/:id zwracał każde zamówienie każdemu zalogowanemu użytkownikowi; konto testowe odczytało zamówienia innego tenant'a, inkrementując numer. Naprawa zajęła dwie linijki: porównanie order.tenantId z session.tenantId przed zwróceniem danych.
Nie będziemy cytować tu fałszywej wskaźnika wykrywalności. Uczciwe i powtarzalne jest to: wyciek NEXT_PUBLIC_ i brakujący zakres tenantów to dwie rzeczy, które znajdujemy w prawie każdym przeglądzie pierwszej fazy, a obie są tanie do naprawy, gdy wiesz, gdzie szukać. Dlatego właśnie lista kontrolna wysuwa je na pierwszy plan jako P0.
Jeśli wolisz, aby zespół przeprowadził ten przegląd za Ciebie przed dniem premiery, to właśnie tym się zajmujemy. Zamów przedpremierowy przegląd bezpieczeństwa →
O autorze
Mert Batur Gurbuz jest Współzałożycielem Techsy.io, gdzie zespół dostarcza agentów AI, systemy automatyzacji oraz pipeline'y voice/SDR dla klientów B2B. Studiuje na University of Birmingham i pisze o stosie narzędzi LLM, z którego zespół Techsy faktycznie korzysta w produkcji. Połącz się na LinkedIn.
Często zadawane pytania
Co powinno znaleźć się na liście kontrolnej bezpieczeństwa SaaS przed premierą?
Sześć kategorii: sekrety i konfiguracja (trzymaj klucze poza bundlem klienckim), uwierzytelnianie i dostęp (użyj biblioteki, dodaj MFA), dane i tenancy (zakres tenant_id plus sprawdzenia własności), zależności (npm audit w CI), sieć i transport (HTTPS, HSTS, CSP, rate limits) oraz monitoring i reagowanie (logi audytu, testowane backupy, runbook).
Czy mój SaaS jest wystarczająco bezpieczny do premiery?
Jesteś gotowy, gdy baza P0 jest zrobiona: sekrety poza bundlem klienckim, izolacja tenantów w każdym zapytaniu, auth na bibliotece, HTTPS z nagłówkami bezpieczeństwa i czyste skanowanie zależności. Perfekcja nie jest celem. Wypuszczona, monitorowana aplikacja z pokrytą bazą bije „idealną”, która nigdy nie startuje.
Czy potrzebuję testów penetracyjnych przed uruchomieniem SaaS?
Nie, aby wystartować legalnie. Priorytetyzuj je, jeśli obsługujesz płatności lub PII, celujesz w klientów enterprise lub jeśli auditor czy inwestor o to poprosi. Na etapie MVP wydaj ten wysiłek najpierw na bazę warstwy aplikacyjnej i OWASP Top 10. Test penetracyjny znajduje więcej, gdy oczywiste luki IDOR i nagłówkowe są już zamknięte.
Czy potrzebuję SOC 2, aby uruchomić SaaS?
Nie. Żaden klient nie oczekuje SOC 2 od startupu, który wystartował w zeszłym tygodniu. To klucz do sprzedaży enterprise, a nie bramka do premiery, i zajmuje miesiące. Wystartuj z bazą warstwy aplikacyjnej, a następnie rozpocznij proces SOC 2, gdy realna umowa enterprise tego wymaga, a nie wcześniej.
Czy powinienem budować własne uwierzytelnianie, czy użyć biblioteki takiej jak Auth.js, Clerk lub Supabase Auth?
Prawie zawsze używaj biblioteki. Auth.js, Clerk i Supabase Auth obsłużyły przypadki brzegowe sesji, tokenów i przepływów resetu, które powodują większość błędów w samodzielnie budowanym auth. Pisanie własnego jest obronliwe tylko wtedy, gdy masz inżyniera bezpieczeństwa i twarde wymaganie, którego żaden dostawca nie spełnia, co jest naprawdę rzadkie.
Jak utrzymać sekrety poza moim bundlem klienckim?
Przeprowadź audyt każdego prefiksu NEXT_PUBLIC_ i VITE_, ponieważ wszystko z tym prefiksem trafia do przeglądarki. Trzymaj .env poza gitem od pierwszego commita, przechowuj sekrety serwera w menedżerze i przeszukuj zbudowany bundle (grep -r "sk_live" .next/) przed wdrożeniem, aby wyłapać wyciekły klucz.
Jak izolować dane tenantów w wielodostępnym SaaS?
Dodaj filtr tenant_id do każdego zapytania i wymuszaj go na warstwie ORM lub repozytorium, aby było to automatyczne. Włącz bezpieczeństwo na poziomie wierszy i poznaj jego tryby awarii (zanieczyszczenie puli, wycieki async). Dodaj sprawdzenie własności do każdego endpointu ID obiektu, aby zamknąć IDOR, i ogranicz klucze cache oraz ścieżki storage'u według tenant'a.
Jakich nagłówków bezpieczeństwa potrzebuje SaaS przed premierą?
Minimum: Strict-Transport-Security (HSTS), Content-Security-Policy, X-Content-Type-Options: nosniff, X-Frame-Options lub frame-ancestors, Referrer-Policy i Permissions-Policy. Zacznij CSP w trybie report-only, przejrzyj naruszenia, a następnie wymuś je. Dokumentacja MDN dotycząca nagłówków bezpieczeństwa wymienia zalecane wartości dla każdego z nich, a powyższa tabela nagłówków podsumowuje, co każdy z nich zatrzymuje.
Czy automatyczne skanowanie, takie jak npm audit lub Snyk, wystarczy?
Konieczne, ale niewystarczające. Narzędzia takie jak npm audit, Snyk i Socket wyłapują znane CVE i złośliwe pakiety, ale nie mogą znaleźć luk w logice biznesowej i kontroli dostępu, takich jak IDOR czy brakujący zakres tenantów. Te wymagają człowieka, konta testowego i jawnego sprawdzenia własności. Uruchom oba: skaner i ręczny przegląd.
Podsumowanie: Lista kontrolna bezpieczeństwa SaaS, którą faktycznie możesz wypuścić
Nie musisz być idealny, aby wystartować. Potrzebujesz bazy. Zamknij najpierw elementy P0: sekrety poza bundlem, izolacja tenantów w każdym zapytaniu, sprawdzenie własności na każdym endpoincie obiektu, auth na bibliotece oraz HTTPS z nagłówkami. Jeśli masz naprawić jedną rzecz przed piątkową premierą, niech będzie to izolacja tenantów, ponieważ to błąd, który wycieka dane klienta bez żadnego ostrzeżenia.
Wszystko tutaj jest gotowe do uruchomienia dzisiaj i żadne z tego nie wymaga budżetu na compliance. Przejdź przez 40 punktów, przekaż sekcje kodu swojemu programiście i wypuszczaj produkt. Chcesz drugiego spojrzenia przed wyjściem na live? Umów bezpłatną konsultację, a przejdziemy listę razem z Tobą.