FlawOpen

flawopen.com/Безопасность Angular/Angular

Защита Angular от XSS: безопасные значения и обходные API

Справочная страница
Краткий ответ

Angular считает значения в привязках шаблона недоверенными: интерполяция экранирует текст, а HTML- и URL-привязки проходят контекстную очистку. Опасная граница — явное доверие: bypassSecurityTrust* указывает Angular пропустить обычную очистку этого значения. Используйте API только после проверки и построения значения для точного контекста безопасности, где оно будет применено.

RISKY — the escape hatch
this.safeHtml = this.sanitizer
  .bypassSecurityTrustHtml(comment);
// <div [innerHTML]="safeHtml"></div>
БЕЗОПАСНЕЕ — оставляйте недоверенный ввод текстом
<div>{{ comment }}</div>
// интерполяция отображает разметку как экранированный текст

Что Angular очищает — и что очистить невозможно

Angular экранирует интерполированный текст и очищает недоверенные значения в контекстах HTML и URL. Например, [innerHTML] удаляет опасную разметку, сохраняя безопасный HTML; обычная интерполяция вообще не разбирает разметку. URL ресурса (например, источник iframe, загружающего исполняемое содержимое) нельзя очистить универсальным способом: он может указывать на произвольный код. Не передавайте контролируемые атакующим значения в bypassSecurityTrustHtml, bypassSecurityTrustUrl, bypassSecurityTrustResourceUrl или родственные API обхода: они объявляют значение безопасным для конкретного контекста и пропускают очистку. Для допустимого встраивания создавайте URL из фиксированного origin и проверенного идентификатора непосредственно перед объявлением значения доверенным.

Проверьте API обхода защиты и DOM-sink

grep -rn "bypassSecurityTrust" --include="*.ts" .

Частые вопросы

Дополнительная защита с CSP и Trusted Types

Используйте Content Security Policy (CSP) и включите принудительный режим Trusted Types как дополнительную защиту вместе с безопасными привязками Angular. При вызове приложением DomSanitizer.bypassSecurityTrust* Angular требует политику Trusted Types angular#unsafe-bypass. По возможности удалите такие вызовы; если это невозможно, учтите каждое место вызова и доверяйте только значениям, проверенным для конкретного контекста.

Очищает ли Angular все способы записи в DOM?

Нет. Привязки шаблона защищены средствами фреймворка, но прямые DOM API, ElementRef и сторонние DOM-библиотеки могут их обходить. По возможности используйте привязки шаблона, отдельно проверяйте такие sink и не объявляйте ввод доверенным без проверки для точного контекста.

Источники

См. также XSS (межсайтовый скриптинг, CWE-79): как он работает и как его предотвратить в любом языке — flawopen.com XSS из-за MIME sniffing: Content-Type и nosniff CSP и экранирование вывода: нужны ли оба? Безопасен ли dangerouslySetInnerHTML в React? Достаточно ли DOMPurify для безопасного innerHTML? Защищает ли Markdown от XSS? Защищает ли Svelte от XSS по умолчанию?