page change angular sanitize

change - page title angular 4



Desinfecte la entrada en Angular2 (1)

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de obtener contenido html de terceros (potencialmente inseguro) de mi base de datos e insertarlo en mi documento html. ¿Cómo puedo hacer eso de forma segura (Protección contra XSS)? En Angular1.x solía haber $sce para desinfectar la entrada, ¿cómo hago eso en Angular2? Por lo que yo entiendo, Angular2 automáticamente lo desinfecta por defecto, ¿es correcto?

Algo como esto no funcionará:

<div class="foo"> {{someBoundValueWithSafeHTML}} // I want HTML from db here </div>


Para insertar HTML normal en su aplicación angular2, puede usar la directiva [innerHtml] .

<div [innerHtml]="htmlProperty"></div>

Esto no funcionará con HTML, que tiene sus propios componentes y directivas, al menos no de la manera que usted esperaría.

Sin embargo, si recibe una advertencia html insegura, primero debe confiar en el HTML antes de inyectarlo. Tienes que usar el DomSanitizer para tal cosa. Por ejemplo, un elemento <h3> se considera seguro. Un elemento <input> no lo es.

export class AppComponent { private _htmlProperty: string = ''<input type="text" name="name">''; public get htmlProperty() : SafeHtml { return this._sanitizer.bypassSecurityTrustHtml(this._htmlProperty); } constructor(private _sanitizer: DomSanitizer){} }

Y que tu plantilla permanezca igual a esta:

<div [innerHtml]="htmlProperty"></div>

Sin embargo, un pequeño mano a mano:

ADVERTENCIA: si llama a este método con datos de usuario que no son de confianza, expone su aplicación a los riesgos de seguridad de XSS.

Si planeas usar esta técnica más, puedes intentar escribir una @Pipe para completar esta tarea.

@Pipe({ name: ''sanitizeHtml'' }) class SanitizeHtml implements PipeTransform { constructor(private _sanitizer: DomSanitizer){} transform(html: string) : SafeHtml { return this._sanitizer.bypassSecurityTrustHtml(html); } }

Si tiene un tubo como este, su AppComponent cambiará a esto. No olvides agregar la tubería a tu matriz de declaraciones de tu NgModule :

@Component({ selector: ''app'', template: `<div [innerHtml]="htmlProperty | sanitizeHtml"></div>` }) export class AppComponent{ public htmlProperty: string = ''<input type="text" name="name">''; }

O puede escribir una @Directive para hacer lo mismo:

@Directive({ selector: ''[sanitizeHtml]'' }) export class SanitizeHtmlDirective { @Input() public sanitizeHtml: string; @HostBinding(''innerHtml'') public get innerHtml(): SafeHtml { return this._sanitizer.bypassSecurityTrustHtml(this.sanitizeHtml); } constructor(private _sanitizer: DomSanitizer){} }

Si tiene una directiva como esta, su AppComponent cambiará a esto. No olvide agregar la directiva a su matriz de declaraciones de su NgModule :

@Component({ selector: ''app'', template: `<div [sanitizeHtml]="htmlProperty"></div>` }) export class AppComponent{ public htmlProperty: string = ''<input type="text" name="name">''; }