Subresource Integrity: защита от подмены внешних скриптов — 13 августа 2026 г. в 16:35:38.198
Subresource Integrity: защита от подмены внешних скриптов 👋 Приветствую в мире цифровой безопасности! Разберём механизм, который защищает от компрометации CDN и сторонних библиотек - ситуация, когда jQuery или Bootstrap подменяются атакующим прямо на стороне поставщика. ⏺Суть проблемы: большинство сайтов подключают внешние скрипты и стили напрямую с CDN. Если CDN скомпрометирован или файл подменён - браузер загрузит и выполнит вредоносный код без единого предупреждения. Именно так работают атаки на цепочку поставок через js-библиотеки. ⏺SRI (Subresource Integrity) решает это через криптографическую проверку: браузер вычисляет хэш загруженного файла и сравнивает с тем что указан в атрибуте integrity. Не совпало - файл не выполняется: <script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"> </script> Даже если CDN отдаст изменённый файл - браузер заблокирует его выполнение. ⏺Генерируем хэш для любого файла самостоятельно: не доверяем хэшам из документации, вычисляем сами: curl -s https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js | \ openssl dgst -sha256 -binary | openssl base64 -A # Или через shasum curl -s https://example.com/lib.js | shasum -a 384 -b | \ awk '{print $1}' | xxd -r -p | base64 Итоговый формат: sha256-<base64> или sha384-<base64> -SHA-384 предпочтительнее для продакшена. ⏺crossorigin=“anonymous” обязателен: без него браузер не отправляет CORS-запрос и не получает заголовки - SRI проверка просто не выполнится. Сервер должен отвечать с Access-Control-Allow-Origin: * для публичных CDN-ресурсов. ⏺Можно указать несколько хэшей через пробел: полезно при миграции или если CDN отдаёт файлы в разных форматах: <script src="https://example.com/lib.js" integrity="sha256-abc123... sha384-def456..." crossorigin="anonymous"> </script> Браузер принимает файл если совпадает хотя бы один из хэшей. ⏺CSP как второй уровень защиты: require-sri-for заставляет браузер требовать SRI для всех скриптов и стилей, даже если атрибут integrity забыли поставить вручную: Content-Security-Policy: require-sri-for script style Без SRI-атрибута браузер заблокирует загрузку ресурса даже с доверенного домена. ⏺Где SRI не работает: динамически генерируемые скрипты где контент меняется при каждом запросе, API-ответы, fetch-запросы из JS - SRI только для тегов script и link в HTML. Для динамических ресурсов нужен другой подход через CSP и доверенные домены. 🤖Бесплатный ChatGPT

