Spec-Zone.ru › Angular.js 1.7

Улучшить эту документацию Просмотреть исходный код $sce

  1. $sceProvider
  2. Сервис в модуле ng

Обзор

$sce — это сервис, предоставляющий AngularJS службы строгого контекстного экранирования.

Строгое контекстное экранирование

Строгое контекстное экранирование (SCE) — это режим, в котором AngularJS ограничивает привязки только отображением надёжных значений. Его цель состоит в том, чтобы помочь писать код, который (а) по умолчанию безопасен, и (б) упрощает аудит на предмет таких уязвимостей, как XSS, кликджекинг и т. д.

Обзор

Для систематического блокирования ошибок XSS AngularJS по умолчанию обрабатывает все значения как ненадежные при связывании с HTML или чувствительными URL-привязками. При связывании ненадежных значений AngularJS автоматически выполнит проверки безопасности (санитария, белые списки, в зависимости от контекста) или сгенерирует ошибку, если не сможет гарантировать безопасность результата. Это поведение сильно зависит от контекста: HTML можно отчистить, но шаблоны URL нельзя, например.

Для иллюстрации рассмотрим директиву ng-bind-html. Она отображает своё значение непосредственно как HTML: мы называем это контекстом. При получении ненадежного входного значения AngularJS попытается отчистить его перед отображением, если доступен санитайзер, и в противном случае сгенерирует ошибку. Чтобы обойти санитацию и отобразить входное значение как есть, необходимо пометить его как надёжное для данного контекста перед связыванием.

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

На практике

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

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

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

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

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

Для обеспечения безопасности по умолчанию AngularJS гарантирует, что привязки проходят процесс очистки или аналогичную проверку, если нет веской причины доверять данному значению в данном контексте. Это доверие формализуется с помощью вызова функции. Это означает, что как разработчик, вы можете предполагать, что все ненадежные привязки безопасны. Затем, чтобы проанализировать ваш код на наличие проблем с безопасностью привязки, вам нужно убедиться, что значения, которые вы помечаете как надёжные, действительно безопасны — поскольку они были получены от вашего сервера, очищены вашей библиотекой и т. д. Вы можете организовать свой код, чтобы помочь с этим — возможно, разрешить выполнять это только файлам в определённом каталоге. Убедиться, что внутренний API, экспонируемый этим кодом, не помечает произвольные значения как надёжные, становится более управляемой задачей.

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

Как это работает?

В привилегированных контекстах директивы и код будут привязаны к результату $sce.getTrusted(контекст, значение), а не к самому значению напрямую. Представьте себе эту функцию как способ обеспечить необходимый контекст безопасности в ваших данных. Директивы используют $sce.parseAs, а не $parse для отслеживания привязок атрибутов, которая выполняет $sce.getTrusted за кулисами для неконстантных литералов. Кроме того, при связывании без директив AngularJS автоматически определит контекст ваших привязок.

Например, ngBindHtml использует $sce.parseAsHtml(выражение привязки). Вот фактический код (несколько упрощённый):

var ngBindHtmlDirective = ['$sce', function($sce) {
  return function(scope, element, attr) {
    scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {
      element.html(value || '');
    });
  };
}];

Воздействие на загрузку шаблонов

Это относится как к директиве ng-include, так и к templateUrl, определяемым директивами директив.

По умолчанию AngularJS загружает шаблоны только с того же домена и протокола, что и документ приложения. Это выполняется путём вызова $sce.getTrustedResourceUrl для URL шаблона. Чтобы загружать шаблоны с других доменов и/или протоколов, вы можете либо добавить их в белый список, либо оборачивают их в надёжное значение.

Обратите внимание: политика браузера Политика одинакового происхождения и политика совместного использования ресурсов из других доменов (CORS) применяются дополнительно и могут ещё больше ограничивать возможность успешной загрузки шаблона. Это означает, что без соответствующей политики CORS загрузка шаблонов с другого домена не будет работать во всех браузерах. Кроме того, загрузка шаблонов с file:// URL не работает в некоторых браузерах.

Это кажется слишком избыточным

Важно помнить, что SCE применяется только к выражениям интерполяции.

Если ваши выражения являются постоянными литералами, они автоматически считаются надёжными, и вам не нужно вызывать $sce.trustAs для них (например, <div ng-bind-html="'<b>implicitly trusted</b>'"></div>) работает (не забудьте включить ngSanitize модуль). $sceDelegate также будет использовать сервис $sanitize, если он доступен при связывании ненадежных значений с $sce.HTML контекстом. AngularJS предоставляет реализацию в angular-sanitize.js, и если вы хотите её использовать, вам также потребуется зависимость от модуля ngSanitize в вашем приложении.

Включённый $sceDelegate имеет разумные значения по умолчанию, позволяющие загружать шаблоны в ng-include из домена вашего приложения, без необходимости знать о SCE. Он блокирует загрузку шаблонов с других доменов или загрузку шаблонов по протоколу http из документа, обслуживаемого по протоколу https. Вы можете изменить их, задав собственные пользовательские списки разрешённых ресурсов и списки запрещённых ресурсов для сопоставления таких URL.

Это значительно снижает избыточность. Гораздо проще заплатить небольшую цену за надёжность и иметь приложение, которое безопасно и может быть проверено на безопасность значительно легче, чем позже добавлять безопасность в приложение.

Какие типы контекстов с надёжными значениями поддерживаются?

Контекст Примечания
$sce.HTML Для HTML, который безопасно подключать в приложение. Директива ngBindHtml использует этот контекст для привязок. Если встретится небезопасное значение и модуль $sanitize присутствует, он очистит значение вместо выдачи ошибки.
$sce.CSS Для CSS, который безопасно подключать в приложение. В настоящее время не используется. Используйте его в своих собственных директивах.
$sce.MEDIA_URL Для URL, которые безопасно отображать как медиа. Автоматически преобразуется из строки путём очистки, когда это необходимо.
$sce.URL Для URL, которые безопасно использовать как ссылки. Автоматически преобразуется из строки путём очистки, когда это необходимо. Обратите внимание, что $sce.URL делает более сильное утверждение о URL, чем $sce.MEDIA_URL , и поэтому контексты, требующие значений, надёжных для $sce.URL, могут использоваться везде, где требуются значения, надёжные для $sce.MEDIA_URL.
$sce.RESOURCE_URL Для URL, которые не только безопасны для использования как ссылки, но и содержимое которых безопасно включать в ваше приложение. Примеры включают ng-include, src / ngSrc привязки для тегов, отличных от IMG (например, IFRAME, OBJECT, и т. д.).

Обратите внимание, что $sce.RESOURCE_URL делает более сильное утверждение о URL, чем $sce.URL или $sce.MEDIA_URL , и поэтому контексты, требующие значений, надёжных для $sce.RESOURCE_URL, могут использоваться везде, где требуются значения, надёжные для $sce.URL или $sce.MEDIA_URL .

$sceDelegateProvider#resourceUrlWhitelist() и $sceDelegateProvider#resourceUrlBlacklist() можно использовать для ограничения надёжных источников для RESOURCE_URL.
$sce.JS Для JavaScript-кода, который безопасно выполнять в контексте вашего приложения. В настоящее время не используется. Используйте его в своих собственных директивах.
Обратите внимание, что до AngularJS 1.7.0, a[href] и img[src] очищали свои интерполированные значения непосредственно, а не полагались на $sce.getTrusted. Начиная с 1.7.0, это больше не так. Теперь такие интерполяции помечаются как требующие $sce.URL (для a[href]) или $sce.MEDIA_URL (для img[src]), чтобы очистка происходила (через $sce.getTrusted...) при оценке выражений службой $interpolate.

В настоящее время в AngularJS нет привязок CSS или JS-контекстов, поэтому соответствующие функции $sce.trustAs пока не применимы. Это может измениться.

Формат элементов в resourceUrlWhitelist/Blacklist

Каждый элемент в этих массивах должен быть одним из следующих:

  • 'self'
    • The special string, 'self', can be used to match against all URLs of the same domain as the application document using the same protocol.
  • String (except the special value 'self')
    • The string is matched against the full normalized / absolute URL of the resource being tested (substring matches are not good enough.)
    • There are exactly two wildcard sequences - * and **. All other characters match themselves.
    • *: matches zero or more occurrences of any character other than one of the following 6 characters: ':', '/', '.', '?', '&' and ';'. It's a useful wildcard for use in a whitelist.
    • **: matches zero or more occurrences of any character. As such, it's not appropriate for use in a scheme, domain, etc. as it would match too much. (e.g. http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might not have been the intention.) Its usage at the very end of the path is ok. (e.g. http://foo.example.com/templates/**).
  • RegExp (see caveat below)
    • Caveat: While regular expressions are powerful and offer great flexibility, their syntax (and all the inevitable escaping) makes them harder to maintain. It's easy to accidentally introduce a bug when one updates a complex expression (imho, all regexes should have good test coverage). For instance, the use of . in the regex is correct only in a small number of cases. A . character in the regex used when matching the scheme or a subdomain could be matched against a : or literal . that was likely not intended. It is highly recommended to use the string patterns and only fall back to regular expressions as a last resort.
    • The regular expression must be an instance of RegExp (i.e. not a string.) It is matched against the entire normalized / absolute URL of the resource being tested (even when the RegExp did not have the ^ and $ codes.) In addition, any flags present on the RegExp (such as multiline, global, ignoreCase) are ignored.
    • If you are generating your JavaScript from some other templating engine (not recommended, e.g. in issue #4006), remember to escape your regular expression (and be aware that you might need more than one level of escaping depending on your templating engine and the way you interpolated the value.) Do make use of your platform's escaping mechanism as it might be good enough before coding your own. E.g. Ruby has Regexp.escape(str) and Python has re.escape. Javascript lacks a similar built in function for escaping. Take a look at Google Closure library's goog.string.regExpEscape(s).

Refer $sceDelegateProvider for an example.

Покажите мне пример использования SCE.

Можно ли полностью отключить SCE?

Да, вы можете. Однако это категорически не рекомендуется. SCE предоставляет множество преимуществ в плане безопасности при небольших затратах на программирование. Будет гораздо сложнее взять приложение с отключенным SCE и либо обеспечить его безопасность самостоятельно, либо включить SCE на более позднем этапе. Это может быть целесообразно в тех случаях, когда у вас много существующего кода, написанного до появления SCE, и вы мигрируете его по модулям. Также обратите внимание, что это параметр на уровне приложения, поэтому если вы пишете библиотеку, вы создадите ошибки безопасности в приложениях, которые её используют.

Тем не менее, вот как вы можете полностью отключить SCE:

angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
  // Completely disable SCE.  For demonstration purposes only!
  // Do not use in new projects or libraries.
  $sceProvider.enabled(false);
});

Использование

$sce();

Методы

  • isEnabled();

    Возвращает логическое значение, указывающее, включен ли SCE.

    Returns

    Boolean

    True, если SCE включен, false в противном случае. Если вы хотите установить значение, вы должны сделать это во время конфигурации модуля на $sceProvider.

  • parseAs(type, expression);

    Преобразует выражение AngularJS expression в функцию. Это похоже на $parse и идентично, когда выражение является литеральной константой. В противном случае оно оборачивает выражение в вызов $sce.getTrusted(type, result)

    Parameters

    Param Type Details
    type string

    Контекст SCE, в котором будет использоваться этот результат.

    expression string

    Строковое выражение для компиляции.

    Returns

    function(context, locals)

    Функция, представляющая скомпилированное выражение:

    • context – {object} – объект, относительно которого вычисляются любые выражения, встроенные в строки (обычно объект области видимости).
    • locals – {object=} – контекстный объект локальных переменных, полезный для переопределения значений в context.
  • trustAs(type, value);

    Делегирует $sceDelegate.trustAs. Таким образом, возвращает обернутый объект, представляющий ваше значение и вашу уверенность в его безопасности для данного контекста. AngularJS может затем использовать это значение как есть в привязках указанного защищенного контекста. Это используется в привязках для ng-bind-html, ng-include, и большинства src интерполяций атрибутов. См. $sce для строгого контекстного экранирования.

    Parameters

    Param Type Details
    type string

    Контекст, в котором это значение безопасно для использования, например, $sce.URL, $sce.RESOURCE_URL, $sce.HTML, $sce.JS или $sce.CSS.

    value *

    Значение, которое следует считать доверенным.

    Returns

    *

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

  • trustAsHtml(value);

    Сокращенный метод. $sce.trustAsHtml(value) → $sceDelegate.trustAs($sce.HTML, value)

    Parameters

    Param Type Details
    value *

    Значение, которое нужно пометить как доверенное для контекста $sce.HTML.

    Returns

    *

    Оборачиваемая версия значения, которая может использоваться как доверенный вариант вашего value в контексте $sce.HTML (например, ng-bind-html).

  • trustAsCss(value);

    Сокращенный метод. $sce.trustAsCss(value) → $sceDelegate.trustAs($sce.CSS, value)

    Parameters

    Param Type Details
    value *

    Значение, которое нужно пометить как доверенное для контекста $sce.CSS.

    Returns

    *

    Оборачиваемая версия значения, которая может использоваться как доверенный вариант вашего value в контексте $sce.CSS. Этот контекст в настоящее время не используется, поэтому почти нет причин использовать эту функцию до сих пор.

  • trustAsUrl(value);

    Сокращенный метод. $sce.trustAsUrl(value) → $sceDelegate.trustAs($sce.URL, value)

    Parameters

    Param Type Details
    value *

    Значение, которое нужно пометить как доверенное для контекста $sce.URL.

    Returns

    *

    Оборачиваемая версия значения, которая может использоваться как доверенный вариант вашего value в контексте $sce.URL. Этот контекст в настоящее время не используется, поэтому почти нет причин использовать эту функцию до сих пор.

  • trustAsResourceUrl(value);

    Сокращенный метод. $sce.trustAsResourceUrl(value) → $sceDelegate.trustAs($sce.RESOURCE_URL, value)

    Parameters

    Param Type Details
    value *

    Значение, которое нужно пометить как доверенное для контекста $sce.RESOURCE_URL.

    Returns

    *

    Оборачиваемая версия значения, которая может использоваться как доверенный вариант вашего value в контексте $sce.RESOURCE_URL (URL-адреса шаблонов в ng-include, большинство привязок атрибутов src, ...)

  • trustAsJs(value);

    Сокращенный метод. $sce.trustAsJs(value) → $sceDelegate.trustAs($sce.JS, value)

    Parameters

    Param Type Details
    value *

    Значение, которое нужно пометить как доверенное для контекста $sce.JS.

    Returns

    *

    Оборачиваемая версия значения, которая может использоваться как доверенный вариант вашего value в контексте $sce.JS. Этот контекст в настоящее время не используется, поэтому почти нет причин использовать эту функцию до сих пор.

  • getTrusted(type, maybeTrusted);

    Делегирует $sceDelegate.getTrusted. Таким образом, принимает любой ввод и либо возвращает значение, которое безопасно для использования в указанном контексте, либо вызывает исключение. Эта функция знает о доверенных значениях, созданных функцией trustAs и ее сокращениями, и когда контексты являются подходящими, возвращает распакованное значение как есть. Наконец, эта функция также может вызывать исключение, когда нет способа преобразовать maybeTrusted в безопасное значение (например, нет доступной или возможной санитарии).

    Parameters

    Param Type Details
    type string

    Контекст, в котором это значение должно использоваться.

    maybeTrusted *

    Результат предыдущего вызова $sce.trustAs или что-либо еще (что не будет считаться доверенным).

    Returns

    *

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

  • getTrustedHtml(value);

    Сокращенный метод. $sce.getTrustedHtml(value) → $sceDelegate.getTrusted($sce.HTML, value)

    Parameters

    Param Type Details
    value *

    Значение для передачи в $sce.getTrusted.

    Returns

    *

    Возвращаемое значение $sce.getTrusted($sce.HTML, value)

  • getTrustedCss(value);

    Сокращенный метод. $sce.getTrustedCss(value) → $sceDelegate.getTrusted($sce.CSS, value)

    Parameters

    Param Type Details
    value *

    Значение для передачи в $sce.getTrusted.

    Returns

    *

    Возвращаемое значение $sce.getTrusted($sce.CSS, value)

  • getTrustedUrl(value);

    Сокращенный метод. $sce.getTrustedUrl(value) → $sceDelegate.getTrusted($sce.URL, value)

    Parameters

    Param Type Details
    value *

    Значение для передачи в $sce.getTrusted.

    Returns

    *

    Возвращаемое значение $sce.getTrusted($sce.URL, value)

  • getTrustedResourceUrl(value);

    Сокращенный метод. $sce.getTrustedResourceUrl(value) → $sceDelegate.getTrusted($sce.RESOURCE_URL, value)

    Parameters

    Param Type Details
    value *

    Значение для передачи в $sceDelegate.getTrusted.

    Returns

    *

    Возвращаемое значение $sce.getTrusted($sce.RESOURCE_URL, value)

  • getTrustedJs(value);

    Метод сокращенной записи. $sce.getTrustedJs(value) → $sceDelegate.getTrusted($sce.JS, value)

    Параметры

    Параметр Тип Описание
    value *

    Значение, которое передаётся в $sce.getTrusted.

    Возвращаемое значение

    *

    Возвращаемое значение $sce.getTrusted($sce.JS, value)

  • parseAsHtml(expression);

    Метод сокращенной записи. $sce.parseAsHtml(expression string) → $sce.parseAs($sce.HTML, value)

    Параметры

    Параметр Тип Описание
    expression string

    Строковое выражение для компиляции.

    Возвращаемое значение

    function(context, locals)

    Функция, представляющая скомпилированное выражение:

    • context – {object} – объект, по отношению к которому оцениваются выражения, вложенные в строки (обычно объект области видимости).
    • locals – {object=} – контекст объекта локальных переменных, полезный для переопределения значений в context.
  • parseAsCss(expression);

    Метод сокращенной записи. $sce.parseAsCss(value) → $sce.parseAs($sce.CSS, value)

    Параметры

    Параметр Тип Описание
    expression string

    Строковое выражение для компиляции.

    Возвращаемое значение

    function(context, locals)

    Функция, представляющая скомпилированное выражение:

    • context – {object} – объект, по отношению к которому оцениваются выражения, вложенные в строки (обычно объект области видимости).
    • locals – {object=} – контекст объекта локальных переменных, полезный для переопределения значений в context.
  • parseAsUrl(expression);

    Метод сокращенной записи. $sce.parseAsUrl(value) → $sce.parseAs($sce.URL, value)

    Параметры

    Параметр Тип Описание
    expression string

    Строковое выражение для компиляции.

    Возвращаемое значение

    function(context, locals)

    Функция, представляющая скомпилированное выражение:

    • context – {object} – объект, по отношению к которому оцениваются выражения, вложенные в строки (обычно объект области видимости).
    • locals – {object=} – контекст объекта локальных переменных, полезный для переопределения значений в context.
  • parseAsResourceUrl(expression);

    Метод сокращенной записи. $sce.parseAsResourceUrl(value) → $sce.parseAs($sce.RESOURCE_URL, value)

    Параметры

    Параметр Тип Описание
    expression string

    Строковое выражение для компиляции.

    Возвращаемое значение

    function(context, locals)

    Функция, представляющая скомпилированное выражение:

    • context – {object} – объект, по отношению к которому оцениваются выражения, вложенные в строки (обычно объект области видимости).
    • locals – {object=} – контекст объекта локальных переменных, полезный для переопределения значений в context.
  • parseAsJs(expression);

    Метод сокращенной записи. $sce.parseAsJs(value) → $sce.parseAs($sce.JS, value)

    Параметры

    Параметр Тип Описание
    expression string

    Строковое выражение для компиляции.

    Возвращаемое значение

    function(context, locals)

    Функция, представляющая скомпилированное выражение:

    • context – {object} – объект, по отношению к которому оцениваются выражения, вложенные в строки (обычно объект области видимости).
    • locals – {object=} – контекст объекта локальных переменных, полезный для переопределения значений в context.

© 2010–2018 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.7.8/docs/api/ng/service/$sce

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API