
Атрибут integrity в HTML применяется для контроля целостности внешних ресурсов, подключаемых через теги script и link. Браузер использует заданный хеш, чтобы проверить, совпадает ли содержимое загружаемого файла с ожидаемым. Если данные были изменены на стороне CDN или при передаче, ресурс не будет выполнен или применён, что напрямую предотвращает подмену кода.
Механизм работы integrity основан на криптографических хеш-функциях, чаще всего SHA-256, SHA-384 или SHA-512. Значение хеша рассчитывается из бинарного содержимого файла и указывается в атрибуте в формате base64. Браузер повторно вычисляет хеш после загрузки ресурса и сравнивает его с указанным значением, не обращаясь к серверу сайта.
Integrity особенно важен при подключении библиотек из публичных CDN, где разработчик не контролирует инфраструктуру хранения. Добавление этого атрибута позволяет зафиксировать конкретную версию файла и исключить скрытые изменения, даже если URL остаётся прежним. Для корректной проверки в большинстве случаев требуется совместное использование с атрибутом crossorigin, иначе браузер не сможет получить доступ к данным ответа.
Поддержка integrity реализована во всех современных браузерах и не требует дополнительной настройки сервера. При этом атрибут не влияет на производительность загрузки и не изменяет порядок выполнения скриптов. Его использование рассматривается как практическая мера повышения безопасности клиентского кода и контроля сторонних зависимостей.
Integrity в HTML: что это и как работает
Значение integrity формируется как результат хеширования файла алгоритмами SHA-256, SHA-384 или SHA-512 и кодируется в base64. В атрибуте допускается указывать несколько хешей через пробел, что даёт возможность поддерживать разные алгоритмы одновременно. Браузер принимает ресурс, если совпал хотя бы один из них.
При подключении ресурсов с другого домена проверка целостности требует указания crossorigin=»anonymous». Без этого браузер не сможет получить тело ответа для вычисления хеша и заблокирует ресурс. Это правило распространяется на CDN и любые внешние хосты, даже если файл публично доступен.
Integrity не заменяет HTTPS, а дополняет его. HTTPS защищает канал передачи, тогда как integrity фиксирует ожидаемое содержимое файла. При обновлении версии библиотеки хеш должен быть пересчитан заново, иначе браузер будет стабильно отклонять загрузку. Для расчёта хеша применяются утилиты вроде openssl или встроенные инструменты CDN.
Что проверяет атрибут integrity при загрузке ресурсов
Атрибут integrity проверяет бинарное содержимое загружаемого файла, а не его имя, URL или HTTP-заголовки. Браузер вычисляет криптографический хеш фактически полученных данных и сравнивает его с контрольным значением, указанным в разметке. Любое расхождение, включая один изменённый байт, приводит к отказу в использовании ресурса.
Проверка выполняется после полной загрузки файла и до его обработки. Для script это означает запрет выполнения JavaScript-кода, для link – игнорирование CSS-стилей. Ошибка проверки не вызывает повторных запросов и не подменяется запасным вариантом, если он явно не предусмотрен в коде страницы.
Integrity не анализирует семантику или безопасность самого кода. Если файл изначально содержит уязвимость, но его содержимое совпадает с заданным хешем, браузер сочтёт ресурс допустимым. Атрибут решает задачу обнаружения подмены, а не оценки качества или корректности скрипта.
Проверка не учитывает динамические модификации на стороне сервера, такие как сжатие, инъекция баннеров или изменение комментариев. Любое отличие от исходного файла, по которому был рассчитан хеш, приведёт к блокировке. Поэтому integrity следует применять только к статичным версиям ресурсов, содержимое которых не меняется без обновления разметки.
Как формируется хеш для integrity и какие алгоритмы применяются

Хеш для атрибута integrity рассчитывается на основе точного бинарного содержимого файла, без учёта URL, имени ресурса или HTTP-заголовков. Исходным материалом служит файл в том виде, в котором он будет отдан браузеру. Даже различие в переносах строк или комментариях приведёт к другому результату.
Для вычисления применяются криптографические алгоритмы семейства SHA, поддерживаемые спецификацией Subresource Integrity:
- SHA-256 – минимально допустимый вариант для современных браузеров
- SHA-384 – распространённый выбор для CDN-библиотек
- SHA-512 – используется реже из-за увеличенного размера значения
Процесс формирования значения включает несколько шагов:
- Чтение файла в бинарном режиме без преобразований
- Вычисление хеша выбранным алгоритмом SHA
- Кодирование результата в формат base64
- Добавление префикса с указанием алгоритма, например sha384-
В атрибуте integrity допускается указание нескольких хешей через пробел. Это позволяет задать альтернативные алгоритмы для совместимости, при этом браузер примет ресурс при совпадении любого из них. Рекомендуется использовать один основной алгоритм и не смешивать хеши от разных версий файла.
Для расчёта хеша подходят утилиты командной строки, такие как openssl dgst, а также инструменты, предоставляемые CDN. Полученное значение должно полностью соответствовать публикуемому файлу, иначе ресурс будет заблокирован при загрузке.
Как правильно указать integrity для тега script

При загрузке скрипта с внешнего домена обязательно добавляется атрибут crossorigin=»anonymous». Без него браузер не сможет получить данные ответа для проверки хеша и отклонит ресурс даже при корректном значении integrity. Это правило действует для всех публичных CDN.
Integrity следует использовать только для статичных файлов. Если скрипт собирается с параметрами, вставляемыми на сервере, или модифицируется промежуточным прокси, контрольная сумма будет нарушена. В таких случаях атрибут не применяется либо файл выносится на собственный хост с полным контролем содержимого.
Для асинхронных и отложенных скриптов порядок указания атрибутов не имеет значения, однако integrity всегда проверяется до выполнения, независимо от async или defer. Если скрипт не прошёл проверку, связанные с ним зависимости не будут инициализированы.
После обновления версии библиотеки хеш необходимо пересчитать и заменить в разметке одновременно с изменением URL. Использование старого значения при новом файле приведёт к постоянному отказу загрузки во всех поддерживаемых браузерах.
Использование integrity с тегом link для CSS-файлов
Атрибут integrity в теге link применяется для проверки целостности CSS-файлов, подключаемых через rel=»stylesheet». Браузер загружает файл стилей полностью, вычисляет хеш его содержимого и сравнивает с указанным значением до применения правил оформления.
При использовании внешних стилей с другого домена требуется атрибут crossorigin=»anonymous». Без него проверка будет считаться неуспешной, и стили не будут применены. Это особенно критично для CSS-фреймворков, подключаемых через CDN.
Integrity подходит только для статичных CSS-файлов. Если сервер изменяет содержимое на лету, добавляет префиксы, комментарии или выполняет минификацию в момент запроса, контрольная сумма перестаёт совпадать. В таких сценариях следует зафиксировать финальную версию файла и пересчитать хеш.
При сбое проверки браузер полностью игнорирует файл стилей, что может привести к отсутствию базового оформления страницы. Поэтому для критичных элементов интерфейса рекомендуется либо размещать CSS локально, либо предусматривать запасной вариант подключения без integrity.
После обновления CSS-хеш должен быть изменён одновременно с публикацией нового файла. Использование устаревшего значения приведёт к систематическому отказу загрузки во всех браузерах, поддерживающих Subresource Integrity.
Роль атрибута crossorigin при работе с integrity
Атрибут crossorigin определяет, имеет ли браузер право получить тело ответа при загрузке внешнего ресурса. Для работы integrity это критично, поскольку без доступа к содержимому файла браузер не может вычислить контрольный хеш и сравнить его с указанным значением.
При отсутствии crossorigin внешний ресурс загружается в режиме «no-cors». В этом режиме ответ считается непрозрачным, и проверка integrity автоматически завершается ошибкой, даже если хеш указан корректно. В результате скрипт не выполняется, а CSS не применяется.
На практике используется только одно значение – anonymous. Оно указывает браузеру не передавать учётные данные и при этом разрешает чтение тела ответа для проверки целостности. Значение use-credentials несовместимо с большинством CDN и приводит к отказу загрузки без соответствующих CORS-заголовков.
| Значение crossorigin | Доступ к содержимому | Совместимость с integrity |
|---|---|---|
| не указан | нет | проверка завершается ошибкой |
| anonymous | да | проверка выполняется корректно |
| use-credentials | да, с учётными данными | требует специальных CORS-заголовков |
Для стабильной работы integrity атрибут crossorigin=»anonymous» должен указываться всегда, когда ресурс загружается с другого домена. Это правило одинаково действует для тегов script и link и не зависит от типа подключаемого файла.
Типовые ошибки при использовании integrity и их последствия

Наиболее распространённые ошибки при работе с атрибутом integrity связаны с рассинхронизацией между фактическим содержимым ресурса и указанным хешем. Такие проблемы приводят к блокировке скриптов и стилей без явных визуальных уведомлений для пользователя.
Часто встречающиеся ошибки:
- Использование хеша от другой версии файла при обновлении библиотеки
- Отсутствие атрибута crossorigin=»anonymous» при загрузке ресурса с внешнего домена
- Расчёт хеша из минифицированного файла, отличающегося от реально отдаваемого сервером
- Подключение ресурсов, модифицируемых CDN, прокси или серверной логикой
- Копирование значения integrity из сторонних источников без проверки соответствия файлу
Последствия таких ошибок проявляются на уровне клиента:
- JavaScript-код полностью не выполняется, что ломает функциональность интерфейса
- CSS-файлы игнорируются, в результате страница отображается без оформления
- Зависимые модули не инициализируются из-за отсутствия базовых скриптов
- Ошибки фиксируются только в консоли браузера и не видны конечному пользователю
Для снижения рисков integrity следует применять только к статичным ресурсам, пересчитывать хеш при каждом изменении файла и проверять загрузку страницы в браузере после обновлений. Контроль версий и автоматизация сборки помогают избежать несоответствий между файлом и его контрольной суммой.
Как обновлять integrity при изменении внешнего ресурса

При любом изменении внешнего ресурса значение атрибута integrity становится недействительным. Обновление начинается с получения точной версии файла, которая будет обеспечиваться CDN или сторонним сервером. Недопустимо рассчитывать хеш на локальной копии, если она отличается от публикуемой.
После загрузки актуального файла вычисляется новый криптографический хеш с использованием одного из алгоритмов SHA. Полученный результат кодируется в base64 и полностью заменяет старое значение в атрибуте integrity. Частичное редактирование или добавление второго хеша от другой версии приводит к непредсказуемой блокировке.
Обновление integrity должно выполняться синхронно с изменением URL ресурса, включая версию в пути или параметрах запроса. Если CDN обновляет файл по тому же адресу, хеш требуется пересчитывать даже при отсутствии визуальных изменений в коде.
После замены значения необходимо проверить загрузку страницы в браузере с очищенным кэшем. В консоли не должно появляться сообщений о нарушении Subresource Integrity. Если используется сборщик или CI, расчёт хеша следует автоматизировать и включить в процесс публикации, чтобы исключить расхождения между файлом и разметкой.
Вопрос-ответ:
Почему браузер блокирует скрипт с корректным URL, но с указанным integrity?
Блокировка происходит, если фактическое содержимое файла не совпадает с хешем в атрибуте integrity. Причиной может быть обновление файла на CDN без смены адреса, серверная минификация, различия в переносах строк или отсутствие crossorigin при загрузке с другого домена. Браузер проверяет только бинарные данные и при расхождении полностью запрещает выполнение скрипта.
Можно ли использовать integrity для локальных файлов, размещённых на своём домене?
Технически это допустимо, браузер выполнит проверку так же, как и для внешних ресурсов. Практический смысл появляется, если файл отдаётся строго в фиксированном виде и не изменяется серверной логикой. При динамической сборке или автогенерации хеш будет постоянно устаревать и приводить к сбоям.
Что произойдёт со страницей, если CSS-файл не прошёл проверку integrity?
Файл стилей будет полностью проигнорирован. Браузер не применит ни одно правило из этого ресурса, включая базовую разметку и шрифты. Ошибка отобразится только в консоли разработчика, поэтому визуальные проблемы могут проявиться без явных уведомлений для пользователя.
Допустимо ли указывать несколько значений integrity для одного ресурса?
Да, спецификация разрешает указывать несколько хешей через пробел. Это используется для поддержки разных алгоритмов SHA. Браузер считает проверку успешной, если совпал хотя бы один хеш, при условии что все значения рассчитаны от одной версии файла.
Как integrity влияет на кэширование ресурсов в браузере?
Integrity не отключает кэширование. Если файл уже сохранён в кэше и его содержимое совпадает с указанным хешем, браузер использует локальную копию. При изменении файла на сервере, но без смены хеша в разметке, кэшированный ресурс будет отклонён после повторной проверки.
