SRI
SRI (Subresource Integrity, W3C) — атрибут integrity у <script>/<link>, гарантирующий что подгруженный ресурс имеет ожидаемый хеш. Защита от компрометации CDN.
Пример
<script src="https://cdn.example.com/jquery-3.7.1.min.js"
integrity="sha384-1H217gwSVyLSIfaLxHbE7dRb3v4mYCKbpQvzx0cegeju1MVsGrX5xXxAvs/HgeFs"
crossorigin="anonymous"></script>
Браузер грузит файл, считает SHA-384, сравнивает. Не совпало → ошибка, скрипт не выполняется.
Алгоритмы
SHA-256, SHA-384, SHA-512. Можно несколько через пробел — браузер выбирает сильнейший.
crossorigin
SRI требует CORS для cross-origin ресурсов. Иначе браузер не может прочитать содержимое для проверки. Атрибут crossorigin="anonymous" обязателен.
Как посчитать
curl -s https://cdn.example.com/jquery.min.js | \
openssl dgst -sha384 -binary | \
openssl base64 -A
# или онлайн
https://www.srihash.org/
Плюсы и минусы
| Плюсы | Минусы |
|---|---|
| защита от CDN-компромата | обновление CDN → обновление integrity |
| защита от MITM (частично) | только статические ресурсы |
| не мешает кешу | не работает с динамикой |
Комбо с CSP
Content-Security-Policy: require-sri-for script style
Обязать все скрипты иметь integrity. Директива работает в Firefox.
Знаменитые взломы CDN
- Event-Stream (npm, 2018) — злонамеренная зависимость крала Bitcoin-кошельки Copay
- British Airways (2018) — Magecart подменил JS, украл 380K платёжек
- Polyfill.io (2024) — китайский владелец начал раздавать вредоносный JS
SRI бы спас во всех случаях.