Ввод <ввод> в innerHTML angular 2

Я пытаюсь ввести входной тег HTML Angular 2, вот мой проект:

    <div [innerHTML]="inputpdf"></div>

..:

export class FaxSendComponent  {
     inputpdf = '<input type="text" name="fname">';
     }

Вот журнал с консоли:

ПРЕДУПРЕЖДЕНИЕ: дезинфекция HTML разделила содержимое (см. http://g.co/ng/security#xss).

Я пытаюсь использовать другой тег html, например <h3>, и он отлично работает.

Ответы

Ответ 1

Прежде чем вводить его, вы должны доверять 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){}
}

И пусть ваш шаблон останется таким же:

<div [innerHTML]="inputpdf"></div>

Немного хедз-ап:

ПРЕДУПРЕЖДЕНИЕ: вызов этого метода с ненадежными пользовательскими данными предоставляет вашему приложению риски безопасности XSS!

Если вы планируете использовать этот метод больше, вы можете попытаться написать Pipe для выполнения этой задачи.

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

   constructor(private _sanitizer: DomSanitizer){}  

   transform(v: string) : SafeHtml {
      return this._sanitizer.bypassSecurityTrustHtml(v); 
   } 
} 

Если у вас есть такой канал, ваш FaxSendComponent изменится на это:

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

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

}

Ответ 2

создайте файл sanitizing.ts, когда вы его используете для связывания внутреннего html.

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);
  }
}

теперь зарегистрируйте этот модуль в своем приложении .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 { }

теперь используется, когда вы можете связать свой 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>

Ответ 3

Попробуйте использовать backticks - `- вместо одиночных кавычек - '-