Lighthouse — это инструмент для анализа производительности, доступности и SEO веб-приложений. Одним из ключевых аспектов его работы является оценка доверенных источников (Trusted Types). Это механизм безопасности браузера, направленный на предотвращение атак типа XSS (Cross-Site Scripting) через строгий контроль над использованием строк, вставляемых в DOM.
Trusted Types представляют собой API, позволяющее браузеру различать обычные строки и безопасные объекты, которые могут использоваться для динамического обновления DOM. Вместо того чтобы проверять каждую строку вручную, браузер доверяет объекту, созданному через API, что обеспечивает строгий контроль.
Основные элементы Trusted Types:
Для работы с Trusted Types создается policy:
const myPolicy = window.trustedTypes.createPolicy('default', {
createHTML: (input) => sanitizeHTML(input),
createScript: (input) => input,
createScriptURL: (input) => input
});
Ключевые моменты:
createHTML должен возвращать безопасный HTML. Обычно
применяется функция очистки (sanitizeHTML) для удаления
потенциально опасного контента.createScript и createScriptURL позволяют
создавать доверенные скрипты и ссылки на скрипты.Lighthouse анализирует веб-страницу на предмет внедрения опасного кода и неправильного использования динамического контента. Основные проверки:
Чтобы интегрировать Trusted Types и повысить оценку Lighthouse по безопасности:
require-trusted-types-for 'script';.Пример проверки и вставки контента с политикой:
const safeHTML = myPolicy.createHTML('<div>Безопасный контент</div>');
document.getElementById('app').innerHTML = safeHTML;
Использование Trusted Types существенно снижает риск XSS и повышает оценку безопасности в Lighthouse. Это не просто рекомендация, а инструмент, обеспечивающий строгий контроль над динамическим контентом и соответствие современным стандартам веб-безопасности.
Правильная настройка политик и постоянная проверка динамического контента через Lighthouse позволяют создавать безопасные веб-приложения без компромиссов между функциональностью и безопасностью.