Whitelist domain thất bại vì bạn tin cả một origin, trong khi origin đó có thể chứa những file khiến CSP vô hiệu.
Ba đường bypass kinh điển:
1. JSONP endpoint trên domain được whitelist: <script src="//cdn.example.com/jsonp?callback=alert(1)"> — script chạy từ domain hợp lệ.
2. Bản copy của thư viện có gadget (AngularJS cũ, một số template engine) nằm trên CDN được whitelist: kẻ tấn công load đúng phiên bản đó rồi dùng nó để eval chuỗi.
3. CDN dùng chung (unpkg, cdnjs) — whitelist chúng gần như là whitelist mọi thư viện JS trên đời.
Ngoài ra whitelist rất khó bảo trì: mỗi lần thêm công cụ analytics/chat lại phải sửa header, và các script đó tự load thêm script con nên whitelist cứ dài ra.
strict-dynamic đổi mô hình: bỏ qua toàn bộ whitelist domain, chỉ tin script được đánh dấu nonce/hash, và truyền tiếp niềm tin cho script mà script đó tạo ra bằng DOM API.
script-src 'nonce-r4nd0m' 'strict-dynamic' https: 'unsafe-inline';https:và'unsafe-inline'để đó làm fallback cho trình duyệt cũ — trình duyệt hiểustrict-dynamicsẽ bỏ qua chúng.- Script loader (GTM, Sentry) chèn thêm script bằng
document.createElement('script')vẫn chạy được. - Nhưng script chèn bằng
innerHTMLthì không được kế thừa niềm tin — đúng thứ ta muốn chặn.
Đây là dạng CSP mà Google gọi là strict CSP và khuyến nghị thay cho whitelist.