Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inject <input> in innerHTML angular 2

Tags:

I am trying to inject a input HTML tag with Angular 2, here is my project :

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

The .ts :

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

Here is the log from the console :

WARNING: sanitizing HTML stripped some content (see http://g.co/ng/security#xss).

I try with other html tag like <h3> and it works perfectly.

like image 752
Alexy Vercruysse Avatar asked Jul 11 '16 09:07

Alexy Vercruysse


People also ask

Is it safe to use innerHTML in angular?

Make sure that as a developer you are following the “Angular way” and its best practices to protect you from XSS. For example, this means you shouldn't use innerHTML, never use templates generated by concatenating user input, and never use native DOM APIs to interact with HTML elements.

How use innerHTML with div tag?

To append using the innerHTML attribute, first select the element (div) where you want to append the code. Then, add the code enclosed as strings using the += operator on innerHTML. Example: html.

What does innerHTML do in angular?

The innerHtml is a property of HTML-Elements, which allows you to set it's html-content programatically. There is also a innerText property which defines the content as plain text. The [attributeName]="value" box bracket , surrounding the attribute defines an Angular input-binding.

What is the difference between interpolated content and innerHTML?

The main difference between interpolated and innerHTML code is the behavior of code interpreted. Interpolated content is always escaped i.e, HTML isn't interpreted and the browser displays angle brackets in the element's text content.


2 Answers

You should trust the HTML first before injecting it. You have to use the DomSanitizer for such a thing. An <h3> element is considered safe. An <input> element is not.

Change your FaxSendComponent to something like this:

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

And have your template stay the same as this:

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

A little heads-up though:

WARNING: calling this method with untrusted user data exposes your application to XSS security risks!

If you plan on using this technique more, you can try to write a Pipe to fulfil this task.

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

If you have a pipe like this, your FaxSendComponent will change to this:

@Component({    selector: 'fax-send',    template: `<div [innerHTML]="inputpdf | sanitizeHtml"></div>` }) export class FaxSendComponent  {      public inputpdf: string = '<input type="text" name="fname">';  } 
like image 131
Poul Kruijt Avatar answered Nov 01 '22 18:11

Poul Kruijt


create sanitizing.ts file when you use it for bind inner 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);   } } 

now register this module into your 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 { } 

now use when you can bind your html eg. 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> 
like image 31
Ketan Chaudhari Avatar answered Nov 01 '22 17:11

Ketan Chaudhari