Subresource Integrity (SRI) - атрибут integrity з криптографічним хешем файлу. Браузер завантажує скрипт чи стиль, обчислює хеш і відмовляється виконувати файл, якщо хеш не збігся.
<script
src="https://cdn.jsdelivr.net/npm/alpinejs@3.14.9/dist/cdn.min.js"
integrity="sha384-..."
crossorigin="anonymous"
defer
></script>
Від чого захищає: від підміни файлу на сторонньому сервері. Якщо CDN зламали чи пакет на ньому підмінили, на сторінку підключиться не шкідливий код, а нічого - браузер заблокує файл з невідповідним хешем. Без SRI скомпрометований CDN отримує повний доступ до всіх сторінок, що його використовують.
Умови роботи:
crossorigin="anonymous"обов'язковий для файлів з іншого походження - браузер має завантажити файл з CORS, щоб мати право перевірити вміст. Без нього сторонній файл із SRI не завантажиться;- хеш прив'язаний до конкретного вмісту: посилання має вести на фіксовану версію (
@3.14.9), а не на «останню» (@3,latest) - інакше оновлення файлу на CDN зламає сайт; - алгоритми -
sha256,sha384,sha512; можна вказати кілька хешів.
Коли SRI має сенс:
- файли зі сторонніх CDN - основний сценарій;
- власний CDN чи об'єктне сховище, якщо їх компрометація - реальний ризик;
- для файлів зі свого ж походження користі небагато: якщо сервер зламано, нападник змінить і HTML з хешами.
Коли SRI не допоможе:
- скрипти, що змінюються (аналітика, тег-менеджери, віджети чату, що оновлюються постачальником) - хеш постійно ламатиметься. Для них - лише обмеження через CSP і довіра до постачальника;
- скрипти, які сам довірений скрипт підвантажує динамічно, - SRI їх не охоплює.
У Laravel з Vite SRI для власних зібраних файлів додається плагіном vite-plugin-manifest-sri: Laravel бачить хеші в маніфесті й додає integrity до тегів @vite автоматично.
Найнадійніша альтернатива - не підключати сторонні CDN узагалі: зібрати залежності в свій бандл. Тоді SRI для них не потрібен, а кількість сторонніх доменів у CSP менша.