/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import {getCurrentSanitizer} from '../render3/instructions'; import {stringify} from '../render3/util'; import {_sanitizeHtml as _sanitizeHtml} from './html_sanitizer'; import {SecurityContext} from './security'; import {_sanitizeStyle as _sanitizeStyle} from './style_sanitizer'; import {_sanitizeUrl as _sanitizeUrl} from './url_sanitizer'; const BRAND = '__SANITIZER_TRUSTED_BRAND__'; /** * A branded trusted string used with sanitization. * * See: {@link TrustedHtmlString}, {@link TrustedResourceUrlString}, {@link TrustedScriptString}, * {@link TrustedStyleString}, {@link TrustedUrlString} */ export interface TrustedString extends String { '__SANITIZER_TRUSTED_BRAND__': 'Html'|'Style'|'Script'|'Url'|'ResourceUrl'; } /** * A branded trusted string used with sanitization of `html` strings. * * See: {@link bypassSanitizationTrustHtml} and {@link htmlSanitizer}. */ export interface TrustedHtmlString extends TrustedString { '__SANITIZER_TRUSTED_BRAND__': 'Html'; } /** * A branded trusted string used with sanitization of `style` strings. * * See: {@link bypassSanitizationTrustStyle} and {@link styleSanitizer}. */ export interface TrustedStyleString extends TrustedString { '__SANITIZER_TRUSTED_BRAND__': 'Style'; } /** * A branded trusted string used with sanitization of `url` strings. * * See: {@link bypassSanitizationTrustScript} and {@link scriptSanitizer}. */ export interface TrustedScriptString extends TrustedString { '__SANITIZER_TRUSTED_BRAND__': 'Script'; } /** * A branded trusted string used with sanitization of `url` strings. * * See: {@link bypassSanitizationTrustUrl} and {@link urlSanitizer}. */ export interface TrustedUrlString extends TrustedString { '__SANITIZER_TRUSTED_BRAND__': 'Url'; } /** * A branded trusted string used with sanitization of `resourceUrl` strings. * * See: {@link bypassSanitizationTrustResourceUrl} and {@link resourceUrlSanitizer}. */ export interface TrustedResourceUrlString extends TrustedString { '__SANITIZER_TRUSTED_BRAND__': 'ResourceUrl'; } /** * An `html` sanitizer which converts untrusted `html` **string** into trusted string by removing * dangerous content. * * This method parses the `html` and locates potentially dangerous content (such as urls and * javascript) and removes it. * * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustHtml}. * * @param unsafeHtml untrusted `html`, typically from the user. * @returns `html` string which is safe to display to user, because all of the dangerous javascript * and urls have been removed. */ export function sanitizeHtml(unsafeHtml: any): string { const s = getCurrentSanitizer(); if (s) { return s.sanitize(SecurityContext.HTML, unsafeHtml) || ''; } if (unsafeHtml instanceof String && (unsafeHtml as TrustedHtmlString)[BRAND] === 'Html') { return unsafeHtml.toString(); } return _sanitizeHtml(document, stringify(unsafeHtml)); } /** * A `style` sanitizer which converts untrusted `style` **string** into trusted string by removing * dangerous content. * * This method parses the `style` and locates potentially dangerous content (such as urls and * javascript) and removes it. * * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustStyle}. * * @param unsafeStyle untrusted `style`, typically from the user. * @returns `style` string which is safe to bind to the `style` properties, because all of the * dangerous javascript and urls have been removed. */ export function sanitizeStyle(unsafeStyle: any): string { const s = getCurrentSanitizer(); if (s) { return s.sanitize(SecurityContext.STYLE, unsafeStyle) || ''; } if (unsafeStyle instanceof String && (unsafeStyle as TrustedStyleString)[BRAND] === 'Style') { return unsafeStyle.toString(); } return _sanitizeStyle(stringify(unsafeStyle)); } /** * A `url` sanitizer which converts untrusted `url` **string** into trusted string by removing * dangerous * content. * * This method parses the `url` and locates potentially dangerous content (such as javascript) and * removes it. * * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustUrl}. * * @param unsafeUrl untrusted `url`, typically from the user. * @returns `url` string which is safe to bind to the `src` properties such as ``, because * all of the dangerous javascript has been removed. */ export function sanitizeUrl(unsafeUrl: any): string { const s = getCurrentSanitizer(); if (s) { return s.sanitize(SecurityContext.URL, unsafeUrl) || ''; } if (unsafeUrl instanceof String && (unsafeUrl as TrustedUrlString)[BRAND] === 'Url') { return unsafeUrl.toString(); } return _sanitizeUrl(stringify(unsafeUrl)); } /** * A `url` sanitizer which only lets trusted `url`s through. * * This passes only `url`s marked trusted by calling {@link bypassSanitizationTrustResourceUrl}. * * @param unsafeResourceUrl untrusted `url`, typically from the user. * @returns `url` string which is safe to bind to the `src` properties such as ``, because * only trusted `url`s have been allowed to pass. */ export function sanitizeResourceUrl(unsafeResourceUrl: any): string { const s = getCurrentSanitizer(); if (s) { return s.sanitize(SecurityContext.RESOURCE_URL, unsafeResourceUrl) || ''; } if (unsafeResourceUrl instanceof String && (unsafeResourceUrl as TrustedResourceUrlString)[BRAND] === 'ResourceUrl') { return unsafeResourceUrl.toString(); } throw new Error('unsafe value used in a resource URL context (see http://g.co/ng/security#xss)'); } /** * A `script` sanitizer which only lets trusted javascript through. * * This passes only `script`s marked trusted by calling {@link bypassSanitizationTrustScript}. * * @param unsafeScript untrusted `script`, typically from the user. * @returns `url` string which is safe to bind to the `