在RC.1中,无法使用绑定语法添加某些样式


Answers:


119

更新(最终版2.0.0)

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Pipe({name: 'safeHtml'})
export class SafeHtml implements PipeTransform {
  constructor(private sanitizer:DomSanitizer){}

  transform(html) {
    return this.sanitizer.bypassSecurityTrustStyle(html);
    // return this.sanitizer.bypassSecurityTrustHtml(html);
    // return this.sanitizer.bypassSecurityTrustScript(html);
    // return this.sanitizer.bypassSecurityTrustUrl(html);
    // return this.sanitizer.bypassSecurityTrustResourceUrl(html);
  }
}

另请参阅https://angular.io/api/platform-b​​rowser/DomSanitizer

<div [innerHTML]="someHtml | safeHtml"

更新

DomSanitizationServiceDomSanitizer在RC.6中重命名为

原版的

此问题应在RC.2中修复

另请参阅《Angular2开发人员指南-安全性》


Angular2引入了对CSS值和属性绑定(如[innerHTML]=...[src]="..."在RC.1

另请参阅https://github.com/angular/angular/issues/8491#issuecomment-217467582

这些值可以通过使用标记为受信任 DomSanitizer.bypassSecurityTrustStyle(...)

import {DomSanitizer} from '@angular/platform-browser';
...
constructor(sanitizer: DomSanitizationService) {
  this.backgroundImageStyle = sanitizer.bypassSecurityTrustStyle('url(' + this.image + ')');
  // for HTML
  // this.backgroundImageStyle = sanitizer.bypassSecurityTrustHtml(...);

}

并绑定到该值,而不是不受信任的纯字符串。

也可以包裹在类似

@Pipe({name: 'safeStyle'})
export class Safe {
  constructor(private sanitizer:Sanitizer){}

  transform(style) {
    return this.sanitizer.bypassSecurityTrustStyle(style);
    // return this.sanitizer.bypassSecurityTrustHtml(style);
    // return this.sanitizer.bypassSecurityTrustScript(value);
    // return this.sanitizer.bypassSecurityTrustUrl(value);
    // return this.sanitizer.bypassSecurityTrustResourceUrl(value);
  }
}
<div [ngStyle]="someStyle | safeStyle"></div>

someHtml = `<a href="#" onClick="alert(document.cookie);">click to see the awesome</a>`;

虽然仍在工作:-[(正在进行中)

柱塞示例(Angular 2.0.0-rc-1)

另请参阅Angular 2安全跟踪问题

https://angular.io/docs/ts/latest/api/platform-b​​rowser/index/DomSanitizer-class.html

提示 {{...}}

无法使用已清除内容的绑定,prop="{{sanitizedContent}}"因为{{}}stringyfyes在分配值之前会破坏其清除状态。



管道是个好主意。谢谢!
Tomer Almog

由于某些原因,当我尝试使用此服务时,依赖项注入不起作用。我没有获得服务实现,而是获得了抽象服务(这是一个空对象)。你知道为什么会这样吗?我想念什么吗?
Yaron Schwimmer

@yarons您可以创建一个新问题并添加一些代码来演示您的实际操作。如果可能的话,允许复制的Plunker。
君特Zöchbauer

2
@SrAxi你是对的。当时它的工作不细,以及
君特Zöchbauer

1

绕过消毒剂以信任任何内容可能是安全问题。由于Angular不是专用的消毒库,因此对可疑内容过分热衷以不承担任何风险。例如,它删除几乎所有属性。您可以将清理委托给专用的库-DOMPurify。这是我制作的包装器库,可以轻松地将Angular与DOMPurify结合使用。

https://github.com/TinkoffCreditSystems/ng-dompurify

它还有一个管道以声明方式清理HTML:

<div [innerHtml]="value | dompurify"></div>

要记住的一件事是DOMPurify非常适合清理HTML / SVG,而不是CSS。因此,您可以提供Angular的CSS清理程序来处理CSS:

import {NgModule, ɵ_sanitizeStyle} from '@angular/core';
import {SANITIZE_STYLE} from '@tinkoff/ng-dompurify';

@NgModule({
    // ...
    providers: [
        {
            provide: SANITIZE_STYLE,
            useValue: ɵ_sanitizeStyle,
        },
    ],
    // ...
})
export class AppModule {}

它是内部的-henseɵ前缀,但是无论如何,这也是Angular团队在其自己的程序包中使用它的方式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.