Raport bezpieczeństwa

shop.example.com

https://shop.example.com/ · 29 września 2026, 14:32 · test trwał 3 min 12 s

DOcena ogólna2 krytyczne problemy wymagają działania w tym tygodniu
Link ważny do 29 października 2026

Od czego zaczęlibyśmy

  • Unieważnijcie jeszcze dziś klucz Stripe z main.js i przenieście wywołania, które go potrzebują, na backend.
  • Aktualizujcie Angulara 15 po jednej wersji głównej aż do 22; każdy krok zamyka znane błędy XSS we frameworku.
  • Wyłączcie publiczne mapy źródeł i dodajcie Content Security Policy, zanim zacznie się aktualizacja.

Co wykryliśmy

FrameworkPrzestarzałe
Angular 15.2.10Bez wsparcia długoterminowego od 18 maja 2024.
Renderowanie
Angular SSR (Express)
Serwer
nginx 1.18.0
CDN
Cloudflare
JavaScript
12 plików, 3.4 MB
BibliotekiPrzestarzałe
lodash 4.17.15, moment 2.29.1, RxJS 7.8.0moment.js: W trybie utrzymania od 2020; autorzy polecają Luxon, date-fns albo Temporal API.

Jak odejść od Angular 15, moment.js

Przenosimy przestarzałe fronty na aktualne technologie ekran po ekranie, a Wasz zespół w tym czasie dalej wdraża nowe funkcje. Dostajecie plan migracji z kolejnością modułów i wyceną czasu.

Wyniki (10)

Krytyczne 2

KrytyczneAngular 15 nie dostaje już poprawek bezpieczeństwaFramework

Co znaleźliśmy

<app-root ng-version="15.2.10">

Czym to grozi

Wsparcie długoterminowe Angulara 15 skończyło się w maju 2024. Podatności znalezione od tego czasu są łatane tylko w wersjach 20, 21 i 22, więc Wasza aplikacja pozostaje na nie podatna.

Jak to naprawić

Aktualizujcie po jednej wersji głównej przez ng update (15 → 16 → … → 22) i uruchamiajcie testy po każdym kroku. Od Angulara 17 możecie też przejść na nowy control flow i sygnały.

ng update @angular/core@16 @angular/cli@16
KrytyczneTajny klucz Stripe w paczce JavaScriptKlucze i tokeny

Co znaleźliśmy

main.4f2a9c1e.js, linia 1: sk_live_51H••••••••••••••••3kQ (nigdy nie zapisujemy pełnej wartości)

Czym to grozi

Każdy, kto otworzy stronę, odczyta ten klucz i może nim robić zwroty, czytać dane klientów albo tworzyć obciążenia na Waszym koncie Stripe.

Jak to naprawić

Unieważnijcie klucz w panelu Stripe jeszcze dziś i wygenerujcie nowy. Wszystkie wywołania, które go potrzebują, przenieście na backend; frontend powinien używać tylko klucza publicznego (pk_live_…).

Wysokie 3

WysokieMapy źródeł są dostępne publicznieKod źródłowy

Co znaleźliśmy

GET /main.4f2a9c1e.js.map → 200 OK (2.1 MB) i 11 kolejnych plików .map

Czym to grozi

Mapy źródeł odtwarzają oryginalny kod TypeScript: nazwy plików, komentarze, wewnętrzne endpointy i logikę biznesową. Z nimi atakującemu dużo łatwiej znaleźć kolejną słabość.

Jak to naprawić

Wyłączcie mapy źródeł w konfiguracji produkcyjnej. Jeśli są potrzebne do śledzenia błędów, wysyłajcie je w trakcie buildu do Sentry (lub podobnego narzędzia) i nie wgrywajcie na serwer.

// angular.json → configurations.production
"sourceMap": false
WysokieOchrona przed XSS wyłączona w 3 miejscachXSS

Co znaleźliśmy

bypassSecurityTrustHtml ×2 (chunk-product.8a1d.js), bypassSecurityTrustResourceUrl ×1 (chunk-cms.19bc.js)

Czym to grozi

Te wywołania każą Angularowi pominąć sanityzację. Jeśli wartość pochodzi od użytkownika, z CMS-a albo z API, atakujący może wstrzyknąć skrypt, który uruchomi się w przeglądarkach Waszych klientów.

Jak to naprawić

Sprawdźcie, skąd pochodzi każda wartość. HTML z CMS-a podpinajcie przez [innerHTML] i zostawcie sanityzację Angularowi. bypassSecurityTrust* zostawcie tylko dla wartości budowanych przez Wasz własny kod i opiszcie, dlaczego.

WysokieBrak Content Security PolicyNagłówki

Co znaleźliśmy

Nagłówki odpowiedzi / nie zawierają Content-Security-Policy

Czym to grozi

Bez CSP przeglądarka uruchomi każdy wstrzyknięty skrypt. CSP to druga linia obrony, gdy błąd XSS jednak się prześlizgnie.

Jak to naprawić

Zacznijcie od polityki w trybie report-only, poprawcie zgłoszone naruszenia, potem ją egzekwujcie. Angular 19+ sam dodaje nonce (autoCsp); w starszych wersjach użyjcie ngCspNonce.

Content-Security-Policy: script-src 'self' 'nonce-{random}'; object-src 'none'; base-uri 'self'

Średnie 3

ŚrednieWewnętrzny adres API w stanie SSRWyciek danych

Co znaleźliśmy

<script id="ng-state"> zawiera "apiBase":"http://10.0.3.14:8080"

Czym to grozi

Strona podaje każdemu odwiedzającemu prywatny adres Waszego serwera API. Sam w sobie nie otwiera drogi do systemu, ale pokazuje mapę sieci wewnętrznej.

Jak to naprawić

Nie umieszczajcie konfiguracji w TransferState. Po stronie klienta używajcie ścieżki względnej (/api), a wewnętrzny adres trzymajcie tylko w zmiennych środowiskowych serwera.

Średnielodash 4.17.15: 1 znana podatnośćBiblioteki

Co znaleźliśmy

lodash 4.17.15 w vendor.3c7e.js (CVE-2020-8203, prototype pollution)

Czym to grozi

Kod, który łączy dane od użytkownika przez _.zipObjectDeep, może zmienić działanie każdego obiektu w aplikacji.

Jak to naprawić

Zaktualizujcie lodash do 4.17.21 lub nowszej wersji i dodajcie npm audit do CI, żeby znane podatności zatrzymywały build.

npm install lodash@^4.17.21
ŚrednieCiasteczko sesji czytelne z JavaScriptuCiasteczka

Co znaleźliśmy

Set-Cookie: sid=…; Path=/; Secure (brak HttpOnly i SameSite)

Czym to grozi

Bez HttpOnly wystarczy jeden błąd XSS, żeby przejąć zalogowaną sesję. Bez SameSite ciasteczko idzie też z żądaniami z innych stron (CSRF).

Jak to naprawić

Ustawiajcie na backendzie ciasteczko sesji z HttpOnly, Secure i SameSite=Lax (albo Strict).

Niskie 2

Niskie2 zewnętrzne skrypty bez sprawdzania integralnościSkrypty zewnętrzne

Co znaleźliśmy

cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.js, cdn.jsdelivr.net/npm/chart.js@3

Czym to grozi

Jeśli CDN albo paczka zostanie przejęta, zmieniony skrypt uruchomi się na Waszej stronie z pełnym dostępem do niej. Tak było z polyfill.io w 2024 roku.

Jak to naprawić

Zainstalujcie te biblioteki z npm i dołączcie do aplikacji albo dodajcie atrybuty integrity i crossorigin z przypiętą wersją.

NiskieBrak pliku security.txtZgłaszanie luk

Co znaleźliśmy

GET /.well-known/security.txt → 404

Czym to grozi

Badacz, który znajdzie podatność, nie wie, jak ją Wam zgłosić, więc zgłoszenia giną albo trafiają najpierw do publicznej wiadomości.

Jak to naprawić

Opublikujcie krótki plik z adresem kontaktowym i datą ważności.

Contact: mailto:security@shop.example.com
Expires: 2027-09-30T00:00:00.000Z

Zaliczone 6

  • HTTP przekierowuje na HTTPS
  • Włączone tylko TLS 1.2 i 1.3
  • Certyfikat ważny do 14 stycznia 2027
  • Angular działa w trybie produkcyjnym
  • X-Content-Type-Options: nosniff
  • Ochrona przed clickjackingiem (frame-ancestors)

Ten test obejmuje to, co widać publicznie: stronę, jej pliki JavaScript i odpowiedzi HTTP. Nie obejmuje repozytorium kodu, stron za logowaniem ani backendu.

Sprawdzimy też to, czego skan nie widzi

Ten test widzi tylko to, co Wasza strona pokazuje publicznie. Sprawdzimy też kod, panel administracyjny i integracje, załatamy znalezione luki i zaplanujemy odejście od Angular 15.

Porozmawiajmy o wynikach