Описание тега angularjs-sce

Строгое контекстное экранирование (SCE) - это режим, в котором AngularJS требует привязки в определенных контекстах, чтобы получить значение, помеченное как безопасное для использования в этом контексте. Одним из примеров такого контекста является привязка произвольного HTML-кода, управляемого пользователем через ng-bind-html. Мы называем эти контексты привилегированными или контекстами SCE.

Начиная с версии 1.2, Angular по умолчанию поставляется с включенным SCE.

Примечание. Когда включено (по умолчанию), IE<11 в режиме совместимости не поддерживается. В этом режиме IE <11 позволяет выполнять произвольный javascript с использованием синтаксиса expression(). Обратитесь, чтобы узнать о них больше. Вы можете убедиться, что ваш документ находится в стандартном режиме, а не в режиме причуд, добавив его в начало HTML-документа.

SCE помогает в написании кода таким образом, чтобы (а) быть безопасным по умолчанию и (б) значительно упростить аудит уязвимостей безопасности, таких как XSS, кликджекинг и т. Д.

Вот пример привязки в привилегированном контексте:

<input ng-model="userHtml" aria-label="User input">
<div ng-bind-html="userHtml"></div>

Обратите внимание, что ng-bind-html привязан к userHtml, управляемой пользователем. Если SCE отключен, это приложение позволяет пользователю отображать произвольный HTML-код в DIV. В более реалистичном примере можно отображать комментарии пользователей, статьи в блогах и т. Д. Через привязки. (HTML - лишь один пример контекста, в котором рендеринг управляемых пользователем данных создает уязвимости безопасности.)

В случае HTML вы можете использовать библиотеку на стороне клиента или на стороне сервера, чтобы очистить небезопасный HTML перед привязкой к значению и отображением его в документе.

Как обеспечить, чтобы каждое место, которое использовало эти типы привязок, было привязано к значению, которое было обработано вашей библиотекой (или возвращено как безопасное для рендеринга вашим сервером?) Как вы можете гарантировать, что вы случайно не удалили строку, которая очистили значение или переименовали некоторые свойства / поля и забыли обновить привязку к очищенному значению?

Чтобы быть безопасным по умолчанию, вы хотите убедиться, что любые такие привязки запрещены, если вы не можете определить, что что-то явно говорит о безопасности использования значения для привязки в этом контексте. Затем вы можете проверить свой код (подойдет простая команда grep), чтобы убедиться, что это делается только для тех значений, которые вы легко можете определить как безопасные - потому что они были получены с вашего сервера, обработаны вашей библиотекой и т. Д. кодовая база, чтобы помочь с этим - возможно, позволяя делать это только файлам в определенном каталоге. Обеспечение того, чтобы внутренний API, предоставляемый этим кодом, не размечал произвольные значения как безопасные, становится более управляемой задачей.

В случае службы SCE AngularJS используется $sce.trustAs (и сокращенные методы, такие как $sce.trustAsHtml и т. Д.) Для получения значений, которые будут приняты SCE / привилегированными контекстами.