Атрибуты integrity и crossorigin в HTML: защита от атак при работе с CDN
Для кого эта статья:
- Веб-разработчики, которые хотят улучшить безопасность своих приложений
- Специалисты по безопасности, интересующиеся современными методами защиты
Ученики и студенты, обучающиеся веб-разработке и безопасности приложений
Безопасность веб-приложений — не просто модный тренд, а необходимость, от которой зависит доверие пользователей и целостность данных. В мире, где CDN становятся неотъемлемой частью инфраструктуры сайтов, два HTML-атрибута приобретают критическое значение:
integrityиcrossorigin. Они как охранники на входе в элитный клуб — проверяют подлинность и разрешения каждого загружаемого ресурса. Разработчики, игнорирующие эти атрибуты, рискуют оставить свои проекты уязвимыми для атак типа MITM и кросс-доменных угроз 🛡️.
Погрузитесь в мир современной безопасной веб-разработки с курсом Обучение веб-разработке от Skypro. Именно здесь вы не только освоите базовые концепции HTML, CSS и JavaScript, но и научитесь правильно использовать атрибуты
integrityиcrossoriginдля защиты ваших проектов. Наши эксперты из реальной индустрии поделятся практическими кейсами и расскажут, как избежать распространённых уязвимостей при работе с CDN.
Что такое атрибуты integrity и crossorigin в HTML
Атрибуты integrity и crossorigin представляют собой механизмы безопасности, встроенные в спецификацию HTML, которые позволяют разработчикам контролировать загрузку внешних ресурсов и защищать пользователей от потенциально вредоносного кода. Эти атрибуты особенно важны при использовании библиотек и фреймворков с CDN (Content Delivery Networks).
Атрибут integrity является частью технологии Subresource Integrity (SRI), которая позволяет браузеру проверить, что ресурс, загруженный с внешнего источника, не был изменён. Это происходит путём сравнения хеш-суммы загруженного файла с хешем, указанным в атрибуте.
Атрибут crossorigin определяет, как элемент обрабатывает запросы к ресурсам, расположенным на других доменах. Он влияет на применение политики CORS (Cross-Origin Resource Sharing) браузером.
| Атрибут | Основное назначение | Уровень защиты |
|---|---|---|
| integrity | Проверка целостности загружаемого ресурса | Высокий (предотвращает выполнение модифицированного кода) |
| crossorigin | Управление кросс-доменными запросами | Средний (регулирует доступ к ресурсам с других доменов) |
Оба атрибута могут использоваться с различными HTML-элементами, в основном с:
<script>— для загрузки JavaScript-файлов<link>— для загрузки CSS-файлов<img>— для загрузки изображений<video>— для загрузки видеофайлов<audio>— для загрузки аудиофайлов
Важно понимать, что хотя эти атрибуты могут использоваться независимо друг от друга, их совместное использование обеспечивает максимальную защиту при работе с внешними ресурсами, особенно при использовании CDN. 🔒

Атрибут integrity: защита от измененного кода
Атрибут integrity — это мощный инструмент защиты веб-приложений от атак, связанных с подменой контента. Он работает на основе криптографических хешей, которые служат своеобразными "цифровыми отпечатками пальцев" для файлов.
Принцип работы атрибута integrity прост и эффективен:
- Разработчик генерирует криптографический хеш для ресурса (обычно SHA-256, SHA-384 или SHA-512)
- Этот хеш добавляется в HTML-тег в качестве значения атрибута
integrity - При загрузке ресурса браузер вычисляет его хеш и сравнивает с указанным значением
- Если хеши не совпадают, браузер блокирует загрузку ресурса и выдаёт ошибку
Вот пример использования атрибута integrity для загрузки jQuery с публичного CDN:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"></script>
Алексей Петров, ведущий специалист по безопасности веб-приложений
Несколько лет назад я работал над крупным финансовым порталом с миллионами пользователей. Мы активно использовали популярные JavaScript-библиотеки с CDN для ускорения загрузки страниц. В один день мониторинговая система зафиксировала странную активность: версия jQuery с CDN содержала вредоносный код, собирающий данные пользователей.
Оказалось, что провайдер одного из наших корпоративных клиентов перехватывал и модифицировал трафик в рамках "оптимизации". К счастью, атрибут
integrity, который мы внедрили месяцем ранее, предотвратил загрузку модифицированного файла. Браузеры наших пользователей просто блокировали измененную библиотеку.После этого инцидента мы внедрили политику обязательного использования атрибута
integrityдля всех внешних ресурсов. Более того, разработали автоматизированную систему, которая генерирует хеши и мониторит изменения в используемых библиотеках. За два года эта система предотвратила еще три подобных случая.
Для генерации хеша можно использовать различные инструменты:
- Онлайн-генераторы SRI, такие как srihash.org
- Командная строка с использованием OpenSSL:
cat FILENAME.js | openssl dgst -sha384 -binary | openssl base64 -A
- npm-пакет sri-toolbox для автоматизации в сборочных процессах
При использовании атрибута integrity следует учитывать несколько важных нюансов:
- Если ресурс обновится на CDN, хеш также необходимо обновить
- Можно указать несколько хешей через пробел для различных алгоритмов
- Атрибут
integrityнаиболее эффективен в сочетании с HTTPS - Для динамически изменяющихся ресурсов атрибут
integrityможет быть неприменим
Важно: при несовпадении хешей браузер полностью блокирует загрузку ресурса, что может привести к нарушению работы сайта. Поэтому необходимо тщательно проверять правильность хешей и иметь план действий на случай, если CDN-ресурс изменится. 🔍
Атрибут crossorigin: управление кросс-доменным доступом
Атрибут crossorigin является ключевым компонентом в системе безопасности современных веб-приложений, регулирующим то, как браузер обрабатывает запросы к ресурсам, размещённым на сторонних доменах. Его основная задача — определить режим CORS (Cross-Origin Resource Sharing) для элемента.
CORS — это механизм безопасности, который позволяет веб-страницам запрашивать ресурсы с других доменов только при определённых условиях. Без правильной настройки CORS браузер блокирует доступ к таким ресурсам согласно политике "Same-Origin Policy".
Атрибут crossorigin может принимать следующие значения:
anonymous— запрос выполняется без передачи учётных данных (cookies, HTTP authentication). Это значение по умолчанию, если атрибут указан без значенияuse-credentials— запрос выполняется с передачей учётных данных пользователя
Практические примеры использования атрибута crossorigin:
<!-- Загрузка шрифта с Google Fonts без передачи учётных данных -->
<link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet" crossorigin="anonymous">
<!-- Загрузка изображения с передачей учётных данных -->
<img src="https://api.example.com/user-avatar.jpg" crossorigin="use-credentials">
Мария Сорокина, технический директор
Работая над интерактивной картой для туристического сервиса, мы столкнулись с проблемой: Canvas отказывался обрабатывать изображения с нашего CDN из-за политики CORS. Это блокировало нашу основную функциональность — возможность скачивать карты для офлайн-использования.
Первая реакция команды была — перенести все ресурсы на основной домен. Однако это негативно сказалось бы на производительности. Вместо этого, мы внимательно изучили атрибут
crossoriginи обнаружили, что для корректной работы с Canvas необходимо явно указывать этот атрибут.Мы добавили
crossorigin="anonymous"ко всем изображениям на карте и настроили наш CDN для отправки правильных CORS-заголовков. Эффект был моментальным — функционал заработал, а метрики производительности показали улучшение на 23% благодаря продолжению использования CDN.Этот опыт научил нас не идти на поводу у первой кажущейся простой технической возможности, а глубже разбираться в стандартах и атрибутах HTML, которые могут решить проблему без архитектурных компромиссов.
Важно понимать, что простого добавления атрибута crossorigin недостаточно. Сервер, с которого загружается ресурс, должен также поддерживать CORS и отправлять соответствующие HTTP-заголовки, такие как Access-Control-Allow-Origin.
| Сценарий | Значение crossorigin | Передача cookies | Типичное применение |
|---|---|---|---|
| Публичные CDN (jQuery, Bootstrap) | anonymous | Нет | Стандартные библиотеки, не требующие аутентификации |
| API с аутентификацией | use-credentials | Да | Приватный контент, требующий аутентификации пользователя |
| Canvas с внешними изображениями | anonymous | Нет | Манипуляции с изображениями в Canvas |
| Шрифты с CDN | anonymous | Нет | Веб-шрифты из внешних источников |
Атрибут crossorigin также критически важен для правильной обработки ошибок в скриптах. Без этого атрибута браузер не предоставляет детальную информацию об ошибках в скриптах, загруженных с других доменов, что существенно затрудняет отладку. 🔄
Взаимодействие атрибутов при работе с CDN
Когда дело касается загрузки ресурсов с CDN, атрибуты integrity и crossorigin работают в тандеме, формируя многоуровневую защиту веб-приложения. Их взаимодействие — не просто сумма возможностей, а синергетический эффект, обеспечивающий и безопасность, и производительность.
При использовании публичных CDN для загрузки библиотек, таких как jQuery, React или Bootstrap, рекомендуется всегда применять оба атрибута. Это связано с тем, что:
integrityгарантирует, что загружаемый файл не был изменен третьими лицамиcrossoriginопределяет правила кросс-доменного взаимодействия и обеспечивает корректную обработку ошибок
Рассмотрим типичный пример загрузки React с CDN, использующий оба атрибута:
<script
src="https://unpkg.com/react@17/umd/react.production.min.js"
integrity="sha384-7Er69WnAl0+tY1MYK5U/MAMPsjBc7qYf+oTQzbYxU3AyNCvfqun6LZDvW8HvU0u6"
crossorigin="anonymous"></script>
В этом примере:
- Браузер инициирует запрос к CDN (unpkg.com)
- CDN отвечает файлом и CORS-заголовками
- Браузер проверяет, соответствует ли хеш полученного файла значению в атрибуте
integrity - Если проверка успешна, скрипт выполняется; в противном случае загрузка блокируется
При работе с CDN существуют определённые нюансы взаимодействия этих атрибутов:
| Сценарий | Integrity | Crossorigin | Результат |
|---|---|---|---|
| Публичная библиотека с CDN | Задан | anonymous | Максимальная защита + кэширование между сайтами |
| Приватный ресурс с CDN | Задан | use-credentials | Защита + авторизованный доступ, но без кросс-сайтового кэширования |
| Публичная библиотека без SRI | Отсутствует | anonymous | Базовая защита CORS без проверки целостности |
| Локальные ресурсы | Отсутствует | Отсутствует | Нет необходимости в CORS или SRI |
Важное замечание: для корректной работы атрибута integrity с CDN, необходимо, чтобы сервер CDN отправлял корректные CORS-заголовки. Большинство популярных CDN, таких как jsDelivr, cdnjs или unpkg, уже настроены для поддержки как CORS, так и SRI. ⚙️
Стратегии использования атрибутов при работе с разными типами CDN:
- Публичные CDN: всегда используйте оба атрибута для максимальной защиты
- Приватные CDN: настраивайте CORS-заголовки на стороне CDN и используйте атрибуты соответственно требованиям безопасности
- Мультидоменные CDN: обеспечьте согласованность CORS-политик на всех доменах CDN
При автоматизации сборки проекта можно использовать инструменты для генерации хешей и автоматического добавления атрибутов в HTML. Webpack, Gulp и другие сборщики имеют плагины, которые значительно упрощают этот процесс. 🔧
Практические сценарии и рекомендации по безопасности
Внедрение атрибутов integrity и crossorigin — не просто теоретическая мера безопасности, а практическая необходимость для современных веб-проектов. Рассмотрим конкретные сценарии и практические рекомендации, которые помогут защитить ваши приложения.
Сценарий 1: Загрузка критичных JavaScript-библиотек
Для библиотек, которые имеют доступ к чувствительным данным или управляют важной функциональностью:
<script
src="https://cdn.example.com/payment-processing.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"></script>
Сценарий 2: Работа с Canvas и внешними изображениями
Для корректной работы с Canvas API и изображениями с других доменов:
<img
src="https://images.example.com/photo.jpg"
crossorigin="anonymous"
id="sourceImage">
<script>
// Canvas не сможет обработать изображение без атрибута crossorigin
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const img = document.getElementById('sourceImage');
img.onload = function() {
ctx.drawImage(img, 0, 0);
// Теперь можно безопасно использовать canvas.toDataURL()
};
</script>
Рекомендации по внедрению безопасности на основе SRI и CORS:
- Автоматизируйте процесс: Используйте инструменты сборки (Webpack, Gulp) для автоматической генерации и добавления хешей
integrity - Мониторинг изменений: Внедрите систему мониторинга, которая будет отслеживать изменения в библиотеках на CDN и обновлять хеши соответственно
- Fallback-стратегии: Предусмотрите запасные варианты на случай, если ресурсы с CDN окажутся недоступными или не пройдут проверку целостности
<script>
function loadScript(src, integrity) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = src;
script.integrity = integrity;
script.crossorigin = 'anonymous';
script.onload = resolve;
script.onerror = () => {
// Попытка загрузить с локального fallback
const fallbackScript = document.createElement('script');
fallbackScript.src = '/assets/libs/jquery.min.js';
fallbackScript.onload = resolve;
fallbackScript.onerror = reject;
document.head.appendChild(fallbackScript);
};
document.head.appendChild(script);
});
}
// Использование
loadScript(
'https://code.jquery.com/jquery-3.6.0.min.js',
'sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK'
).then(() => {
console.log('jQuery loaded successfully');
}).catch(() => {
console.error('Failed to load jQuery from all sources');
});
</script>
Чек-лист безопасности для работы с внешними ресурсами:
- ✅ Используйте HTTPS для всех внешних ресурсов
- ✅ Добавляйте атрибуты
integrityдля всех статических ресурсов с CDN - ✅ Указывайте
crossorigin="anonymous"для всех внешних ресурсов - ✅ Настройте CSP (Content Security Policy) для дополнительной защиты
- ✅ Регулярно обновляйте хеши при обновлении библиотек
- ✅ Тестируйте сайт с разными настройками безопасности браузера
- ✅ Имейте локальные копии критически важных библиотек
Важно помнить о потенциальных проблемах, которые могут возникнуть при использовании атрибутов integrity и crossorigin:
- Проблемы с кэшированием: Некорректная настройка может привести к повторным загрузкам ресурсов
- Сложности с динамическим контентом: SRI работает только со статическими ресурсами
- Отладка ошибок: Ошибки, связанные с SRI, могут быть не очевидны в консоли браузера
Для крупных проектов рекомендуется разработать внутреннюю политику использования CDN и атрибутов безопасности, которая определит:
- Критерии выбора CDN для различных типов ресурсов
- Процессы обновления хешей при выпуске новых версий библиотек
- Стратегии резервного копирования и fallback
- Процедуры мониторинга и реагирования на проблемы безопасности
Внедрение этих практик значительно повысит безопасность вашего веб-приложения и минимизирует риски, связанные с использованием внешних ресурсов и CDN. 🛠️
Атрибуты
integrityиcrossorigin— это не просто технические детали HTML, а фундаментальные инструменты безопасности в арсенале современного веб-разработчика. Их правильное использование помогает защитить пользователей от атак, основанных на модификации контента, и обеспечивает надежную работу с CDN. Игнорирование этих атрибутов — непозволительная роскошь для проектов, где безопасность пользователей является приоритетом. Начните внедрять эти практики сегодня, и ваши веб-приложения станут значительно более устойчивыми к современным угрозам.