2018-03-01 17:14:01 -08:00
|
|
|
/**
|
|
|
|
|
* @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
|
|
|
|
|
*/
|
|
|
|
|
|
2018-11-21 21:14:06 -08:00
|
|
|
import {SANITIZER} from '../render3/interfaces/view';
|
|
|
|
|
import {getLView} from '../render3/state';
|
2018-03-01 17:14:01 -08:00
|
|
|
import {stringify} from '../render3/util';
|
|
|
|
|
|
2018-07-11 10:58:18 -07:00
|
|
|
import {BypassType, allowSanitizationBypass} from './bypass';
|
2018-03-01 17:14:01 -08:00
|
|
|
import {_sanitizeHtml as _sanitizeHtml} from './html_sanitizer';
|
2018-11-28 15:54:38 -08:00
|
|
|
import {Sanitizer, SecurityContext} from './security';
|
2018-07-11 10:58:18 -07:00
|
|
|
import {StyleSanitizeFn, _sanitizeStyle as _sanitizeStyle} from './style_sanitizer';
|
2018-03-01 17:14:01 -08:00
|
|
|
import {_sanitizeUrl as _sanitizeUrl} from './url_sanitizer';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 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 {
|
2018-11-28 15:54:38 -08:00
|
|
|
const sanitizer = getSanitizer();
|
2018-11-21 21:14:06 -08:00
|
|
|
if (sanitizer) {
|
|
|
|
|
return sanitizer.sanitize(SecurityContext.HTML, unsafeHtml) || '';
|
2018-05-09 15:30:16 -07:00
|
|
|
}
|
2018-07-11 10:58:18 -07:00
|
|
|
if (allowSanitizationBypass(unsafeHtml, BypassType.Html)) {
|
2018-03-01 17:14:01 -08:00
|
|
|
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 {
|
2018-11-28 15:54:38 -08:00
|
|
|
const sanitizer = getSanitizer();
|
2018-11-21 21:14:06 -08:00
|
|
|
if (sanitizer) {
|
|
|
|
|
return sanitizer.sanitize(SecurityContext.STYLE, unsafeStyle) || '';
|
2018-05-09 15:30:16 -07:00
|
|
|
}
|
2018-07-11 10:58:18 -07:00
|
|
|
if (allowSanitizationBypass(unsafeStyle, BypassType.Style)) {
|
2018-03-01 17:14:01 -08:00
|
|
|
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 `<img src>`, because
|
|
|
|
|
* all of the dangerous javascript has been removed.
|
|
|
|
|
*/
|
|
|
|
|
export function sanitizeUrl(unsafeUrl: any): string {
|
2018-11-28 15:54:38 -08:00
|
|
|
const sanitizer = getSanitizer();
|
2018-11-21 21:14:06 -08:00
|
|
|
if (sanitizer) {
|
|
|
|
|
return sanitizer.sanitize(SecurityContext.URL, unsafeUrl) || '';
|
2018-05-09 15:30:16 -07:00
|
|
|
}
|
2018-07-11 10:58:18 -07:00
|
|
|
if (allowSanitizationBypass(unsafeUrl, BypassType.Url)) {
|
2018-03-01 17:14:01 -08:00
|
|
|
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 `<img src>`, because
|
|
|
|
|
* only trusted `url`s have been allowed to pass.
|
|
|
|
|
*/
|
|
|
|
|
export function sanitizeResourceUrl(unsafeResourceUrl: any): string {
|
2018-11-28 15:54:38 -08:00
|
|
|
const sanitizer = getSanitizer();
|
2018-11-21 21:14:06 -08:00
|
|
|
if (sanitizer) {
|
|
|
|
|
return sanitizer.sanitize(SecurityContext.RESOURCE_URL, unsafeResourceUrl) || '';
|
2018-05-09 15:30:16 -07:00
|
|
|
}
|
2018-07-11 10:58:18 -07:00
|
|
|
if (allowSanitizationBypass(unsafeResourceUrl, BypassType.ResourceUrl)) {
|
2018-03-01 17:14:01 -08:00
|
|
|
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.
|
|
|
|
|
*
|
2018-11-21 21:14:06 -08:00
|
|
|
* This passes only `script`s marked trusted by calling {@link
|
|
|
|
|
* bypassSanitizationTrustScript}.
|
2018-03-01 17:14:01 -08:00
|
|
|
*
|
|
|
|
|
* @param unsafeScript untrusted `script`, typically from the user.
|
|
|
|
|
* @returns `url` string which is safe to bind to the `<script>` element such as `<img src>`,
|
2018-11-21 21:14:06 -08:00
|
|
|
* because only trusted `scripts` have been allowed to pass.
|
2018-03-01 17:14:01 -08:00
|
|
|
*/
|
|
|
|
|
export function sanitizeScript(unsafeScript: any): string {
|
2018-11-28 15:54:38 -08:00
|
|
|
const sanitizer = getSanitizer();
|
2018-11-21 21:14:06 -08:00
|
|
|
if (sanitizer) {
|
|
|
|
|
return sanitizer.sanitize(SecurityContext.SCRIPT, unsafeScript) || '';
|
2018-05-09 15:30:16 -07:00
|
|
|
}
|
2018-07-11 10:58:18 -07:00
|
|
|
if (allowSanitizationBypass(unsafeScript, BypassType.Script)) {
|
2018-03-01 17:14:01 -08:00
|
|
|
return unsafeScript.toString();
|
|
|
|
|
}
|
|
|
|
|
throw new Error('unsafe value used in a script context');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2018-07-11 10:58:18 -07:00
|
|
|
* The default style sanitizer will handle sanitization for style properties by
|
|
|
|
|
* sanitizing any CSS property that can include a `url` value (usually image-based properties)
|
2018-03-01 17:14:01 -08:00
|
|
|
*/
|
2018-07-11 10:58:18 -07:00
|
|
|
export const defaultStyleSanitizer = (function(prop: string, value?: string): string | boolean {
|
|
|
|
|
if (value === undefined) {
|
|
|
|
|
return prop === 'background-image' || prop === 'background' || prop === 'border-image' ||
|
|
|
|
|
prop === 'filter' || prop === 'filter' || prop === 'list-style' ||
|
|
|
|
|
prop === 'list-style-image';
|
|
|
|
|
}
|
2018-03-01 17:14:01 -08:00
|
|
|
|
2018-07-11 10:58:18 -07:00
|
|
|
return sanitizeStyle(value);
|
|
|
|
|
} as StyleSanitizeFn);
|
2018-11-28 15:54:38 -08:00
|
|
|
|
|
|
|
|
function getSanitizer(): Sanitizer|null {
|
|
|
|
|
const lView = getLView();
|
|
|
|
|
return lView && lView[SANITIZER];
|
|
|
|
|
}
|