API ufało ID.
Nie sprawdzało właściciela.
Techniczne case study BOLA w SaaS/API B2B: cross-tenant read, eksporty, joby, linki share, macierz testów i wzorzec naprawy autoryzacji.
authorization
authorization
innego tenant-a
i reputacyjne
API ufało identyfikatorom bardziej niż tokenowi
W API najczęstszy błąd autoryzacji wygląda banalnie: użytkownik ma poprawny token, więc backend wykonuje operację na obiekcie wskazanym w URL. Problem w tym, że token mówi „kim jesteś”, ale nie mówi automatycznie „czy możesz dotknąć tego konkretnego raportu, faktury, projektu albo tenantId”.
Ten case jest zanonimizowany. Pokazujemy syntetyczne endpointy i response’y, które oddają mechanizm: separacja tenantów, eksporty, raporty, załączniki i role. Nie ma tu prawdziwych hostów, klientów ani identyfikatorów.
Najpierw rysujemy relacje
W systemach B2B sama rola „user” nie wystarczy. Najważniejszy jest tenant i relacja do obiektu. Błędy pojawiają się, gdy endpoint sprawdza tylko rolę, a nie sprawdza przynależności obiektu do organizacji użytkownika.
Raport innego tenant-a zwrócił 200 OK
Backend sprawdzał, czy token jest ważny i czy użytkownik ma rolę user. Nie sprawdzał, czy report.tenantId należy do tenantów przypisanych do użytkownika.
Najgorsze luki często siedzą poza głównym endpointem
To częsty wzorzec: endpoint główny bywa poprawiony, ale eksport, PDF, załącznik, job asynchroniczny albo link tymczasowy ma osobną ścieżkę kodu i słabszą autoryzację. Dlatego test BOLA musi obejmować cały lifecycle obiektu.
BOLA spotkało BFLA
To pokazuje różnicę między BOLA i BFLA. BOLA: czy mogę dotknąć obiektu innego tenant-a? BFLA: czy zwykły użytkownik może wykonać funkcję, która powinna być zarezerwowana dla administratora lub właściciela? W praktyce często występują razem.
Nie mówi automatycznie, do którego raportu masz prawo.
Co testujemy w API B2B
Jeżeli cross-tenant access obejmuje raporty, faktury, dokumenty, dane osobowe, eksporty lub linki share, ryzyko zwykle jest wysokie lub krytyczne. Szczególnie w SaaS B2B.
Najczęstsze powody
BOLA
Brak sprawdzenia relacji user → tenant → object przy każdym odczycie, eksporcie i pobraniu.
BFLA
Funkcje share/export/job dostępne dla roli, która nie powinna ich wykonywać na danym obiekcie.
Asynchroniczne joby
Job exportu dziedziczył tylko token twórcy zadania, ale nie walidował ponownie obiektu przy generowaniu wyniku.
Signed URLs
Link tymczasowy był wystawiany po słabej walidacji i potem działał bez kontekstu użytkownika.
Wzorzec autoryzacji dla multi-tenant API
1. Nie ufaj parametrom tenantId z requestu. Tenant użytkownika pochodzi z tokena/sesji i bazy, nie z URL-a albo body.
2. Query scoped by tenant. Zapytanie do bazy powinno zawierać warunek tenant_id wynikający z kontekstu użytkownika. Nie pobieraj obiektu globalnie, a potem „sprawdzaj później”.
3. Autoryzacja przy jobach. Job exportu musi przechowywać kontekst uprawnień i ponownie walidować dostęp przed wygenerowaniem oraz wydaniem wyniku.
4. Testy kontraktowe. Każdy endpoint z {id} powinien mieć test negatywny dla obiektu innego tenant-a.
Budujesz SaaS B2B albo API dla klientów?
Sprawdzimy separację tenantów, BOLA/BFLA, eksporty, joby, signed URLs, załączniki i wszystkie ścieżki omijające UI.
Zamów test bezpieczeństwa →