Script bên thứ ba chạy cùng origin, cùng quyền với code của bạn: đọc được DOM, cookie không HttpOnly, gọi API thay người dùng. Tin một script bên ngoài là tin toàn bộ chuỗi cung ứng của họ.
Đây là dạng tấn công Magecart: kẻ tấn công không phá site bạn mà chiếm bucket/CDN của nhà cung cấp, sửa file JS, và mọi trang nhúng file đó bắt đầu gửi số thẻ đi.
Subresource Integrity (SRI) cho phép ghim hash của file: trình duyệt tải xong, băm lại, khác hash thì từ chối thực thi.
<script src="https://cdn.example.com/lib.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+..."
crossorigin="anonymous"></script>Giới hạn của SRI — phần hay bị hỏi tiếp:
- Chỉ dùng được với file có URL và nội dung cố định. Script analytics/chat thường là endpoint luôn thay đổi (gtm.js, widget.js) → không ghim hash được.
- SRI chỉ bảo vệ file trực tiếp; script đó tự document.createElement('script') tải thêm file con thì không được kiểm tra.
- Cần crossorigin="anonymous" và server phải trả CORS header, nếu không script bị chặn.
Vì vậy SRI là một lớp, không phải giải pháp trọn gói. Bổ sung:
- Ghim phiên bản cụ thể thay vì @latest; self-host bản đã kiểm tra và tự cập nhật theo quy trình.
- CSP với connect-src chặt để script bên thứ ba không gửi dữ liệu tới domain lạ, cộng strict-dynamic nếu cần loader.
- Cô lập widget nặng vào iframe sandbox khác origin; giao tiếp qua postMessage có kiểm tra event.origin.
- Trang thanh toán và trang đăng nhập: không nhúng script bên thứ ba nào. Đây là quy tắc đơn giản nhất và hiệu quả nhất.
- Rà soát định kỳ danh sách script đang chạy trên production — thực tế nó luôn dài hơn ta nhớ.