HTML z CMS-a i redaktorzy z dużymi uprawnieniami
Treści stron i opisy produktów przychodzą z headless CMS jako HTML. Redaktorzy wklejają tam osadzenia z YouTube, tabele i czasem kod z zewnętrznych stron. Pentest pokazał, że konto redaktora może wstawić skrypt, który wykona się u każdego klienta, także w panelu administracyjnym.
Zanim rozwiniesz: powiedz na głos, jak byś to rozwiązał, i nazwij co najmniej jeden kompromis.
Moje rozwiązanie
Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.
Pokaż, czego szuka rekruter, i modelową odpowiedź
Co sprawdza rekruter
- Czy wiesz, że zaufany CMS nie oznacza bezpiecznej treści
- Czy znasz sanitizację po stronie serwera i klienta oraz Trusted Types
- Czy proponujesz zmianę modelu treści, a nie tylko filtr
Odpowiedź seniora
Konto redaktora może zostać przejęte, więc treść z CMS traktuję jak dane od użytkownika. Najlepszym rozwiązaniem jest zmiana modelu: zamiast surowego HTML CMS zwraca ustrukturyzowane treści (rich text jako JSON, np. Portable Text albo bloki), które renderujemy własnymi komponentami. Osadzenia to osobny typ bloku z białą listą dostawców i parsowaniem tylko identyfikatora filmu.
Tam, gdzie HTML musi zostać, sanitizuję go po stronie serwera przy zapisie lub w BFF (DOMPurify z jsdom albo sanitize-html z białą listą tagów i atrybutów) i drugi raz przy renderowaniu. Usuwam atrybuty zdarzeń, javascript: w linkach, iframe spoza listy.
Obrona w głąb: Content Security Policy z nonce i bez unsafe-inline, Trusted Types (require-trusted-types-for 'script'), które zmuszają cały kod do przejścia przez politykę sanitizacji przed wstawieniem do innerHTML. Panel administracyjny na osobnej domenie, żeby XSS w treści nie dał dostępu do sesji admina.
Typowe wpadki
- Założenie, że redaktorzy są zaufani, więc sanitizacja zbędna
- Własne wyrażenia regularne do usuwania tagów script
- Sanitizacja tylko w jednym miejscu
Dopytają o
- Jak wdrożysz Trusted Types w aplikacji z bibliotekami, które używają innerHTML?
- Co zrobisz z istniejącymi treściami w bazie?
- Jak przetestujesz, że sanitizacja działa po aktualizacji biblioteki?