在innerHTML angular 2中注入<input>

Ale*_*sse 21 html typescript angular

我试图用Angular 2注入一个输入HTML标签,这是我的项目:

    <div [innerHTML]="inputpdf"></div>
Run Code Online (Sandbox Code Playgroud)

.ts:

export class FaxSendComponent  {
     inputpdf = '<input type="text" name="fname">';
     }
Run Code Online (Sandbox Code Playgroud)

这是控制台的日志:

警告:清理HTML会删除一些内容(请参阅 http://g.co/ng/security#xss).

我尝试使用其他html标签<h3>,它完美无缺.

Pie*_*Duc 33

HTML在注射之前你应该相信第一个.你必须使用DomSanitizer这样的东西.一个<h3>元素被认为是安全的.一个<input>元素是没有的.

把你FaxSendComponent改成这样的东西:

export class FaxSendComponent  {

    private _inputpdf: string = '<input type="text" name="fname">';

    public get inputpdf() : SafeHtml {
       return this._sanitizer.bypassSecurityTrustHtml(this._inputpdf);
    }

    constructor(private _sanitizer: DomSanitizer){}
}
Run Code Online (Sandbox Code Playgroud)

并让您的模板与此保持一致:

<div [innerHTML]="inputpdf"></div>
Run Code Online (Sandbox Code Playgroud)

虽然有点单挑:

警告:使用不受信任的用户数据调用此方法会使应用程序面临XSS安全风险!

如果您打算更多地使用此技术,您可以尝试编写一个Pipe来完成此任务.

@Pipe({
    name: 'sanitizeHtml'
})
export class SanitizeHtml implements PipeTransform  {

   constructor(private _sanitizer: DomSanitizer){}  

   transform(v: string) : SafeHtml {
      return this._sanitizer.bypassSecurityTrustHtml(v); 
   } 
} 
Run Code Online (Sandbox Code Playgroud)

如果您有这样的管道,您FaxSendComponent将改为:

@Component({
   selector: 'fax-send',
   template: `<div [innerHTML]="inputpdf | sanitizeHtml"></div>`
})
export class FaxSendComponent  {

    public inputpdf: string = '<input type="text" name="fname">';

}
Run Code Online (Sandbox Code Playgroud)

  • 以下是导入:来自'@ angular/platform-b​​rowser'的`import {DomSanitizer,SafeHtml};` (5认同)

小智 7

当你将它用于绑定内部html时创建sanitizing.ts文件.

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

@Pipe({
  name: 'sanitizeHtml'
})
export class SanitizeHtmlPipe implements PipeTransform {

  constructor(private _sanitizer:DomSanitizer) {
  }

  transform(v:string):SafeHtml {
    return this._sanitizer.bypassSecurityTrustHtml(v);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在将此模块注册到app.module.ts中

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { routes } from './app.routing';

import { SanitizeHtmlPipe } from './product_details/filter';

@NgModule({
  declarations: [
    SanitizeHtmlPipe
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    BrowserAnimationsModule,
    CookieLawModule,
    routes
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)

现在使用时,你可以绑定你的HTML,例如.productDetails.html

<section class="multiple-img">
   <div class="container" *ngIf="product_details">
    <div class="row">
      <h1 class="main-titel-text">Detail</h1>
    </div>
    <div class="row">
      <div class="col-md-3 col-sm-3 col-xs-12">
        <div class="product-box-div">
          <div class="product-img-div">
            <img src="{{image_url.product_images}}{{product_details.product_image}}" alt="Product"/>
          </div>
          <div class="product-name-div">Name:- {{ product_details.product_name }}</div>
          <div class="product-name-div">Price:- {{ product_details.product_price }}</div>
          <div class="product-name-div">Selling Price:- {{ product_details.product_discount_price }}</div>
          <div class="product-name-div" [innerHTML]="product_details.product_description | sanitizeHtml"></div>
        </div>
      </div>
    </div>
  </div>
</section>
Run Code Online (Sandbox Code Playgroud)