From ae2d8f27306c940bc127560649eb7fda8c10f291 Mon Sep 17 00:00:00 2001 From: Ward Bell Date: Tue, 31 May 2016 18:36:22 -0700 Subject: [PATCH] docs(template-syntax): add brief example of HTML sanitization in binding. Also clarified interpolation v. property binding example for PR #1564 --- .../template-syntax/ts/app/app.component.html | 13 +- .../template-syntax/ts/app/app.component.ts | 123 +++++++++--------- .../docs/ts/latest/guide/template-syntax.jade | 20 ++- .../devguide/template-syntax/evil-title.png | Bin 0 -> 32206 bytes 4 files changed, 92 insertions(+), 64 deletions(-) create mode 100644 public/resources/images/devguide/template-syntax/evil-title.png diff --git a/public/docs/_examples/template-syntax/ts/app/app.component.html b/public/docs/_examples/template-syntax/ts/app/app.component.html index ed43a2ff33..57f73c4cb2 100644 --- a/public/docs/_examples/template-syntax/ts/app/app.component.html +++ b/public/docs/_examples/template-syntax/ts/app/app.component.html @@ -197,13 +197,18 @@ button -Interpolated:
-Property bound: +

is the interpolated image.

+

is the property bound image.

-
The interpolated title is {{title}}
-
+

"{{title}}" is the interpolated title.

+

"" is the property bound title.

+ +

"{{evilTitle}}" is the interpolated evil title.

+

"" is the property bound evil title.

+ + top diff --git a/public/docs/_examples/template-syntax/ts/app/app.component.ts b/public/docs/_examples/template-syntax/ts/app/app.component.ts index 33ddaa9bf1..c4e32c74d1 100644 --- a/public/docs/_examples/template-syntax/ts/app/app.component.ts +++ b/public/docs/_examples/template-syntax/ts/app/app.component.ts @@ -1,4 +1,5 @@ -//#docplaster +/* tslint:disable:member-ordering forin */ +// #docplaster import { AfterViewInit, Component, ElementRef, OnInit, QueryList, ViewChildren } from '@angular/core'; import { NgForm } from '@angular/common'; @@ -8,7 +9,7 @@ import { HeroDetailComponent, BigHeroDetailComponent } from './hero-detail.compo import { MyClickDirective, MyClickDirective2 } from './my-click.directive'; // Alerter fn: monkey patch during test -export function alerter(msg?:string) { +export function alerter(msg?: string) { window.alert(msg); } @@ -27,7 +28,7 @@ export enum Color {Red, Green, Blue}; }) export class AppComponent implements AfterViewInit, OnInit { - ngOnInit(){ + ngOnInit() { this.refreshHeroes(); } @@ -40,43 +41,48 @@ export class AppComponent implements AfterViewInit, OnInit { badCurly = 'bad curly'; classes = 'special'; - callFax(value:string) {this.alert(`Faxing ${value} ...`)} - callPhone(value:string) {this.alert(`Calling ${value} ...`)} + callFax(value: string) {this.alert(`Faxing ${value} ...`); } + callPhone(value: string) {this.alert(`Calling ${value} ...`); } canSave = true; Color = Color; color = Color.Red; - colorToggle() {this.color = (this.color === Color.Red)? Color.Blue : Color.Red} + colorToggle() {this.color = (this.color === Color.Red) ? Color.Blue : Color.Red; } currentHero = Hero.MockHeroes[0]; - deleteHero(hero:Hero){ - this.alert('Deleted hero: '+ (hero && hero.firstName)) + deleteHero(hero: Hero) { + this.alert('Deleted hero: ' + (hero && hero.firstName)); } - // DevMode memoization fields - private priorClasses:{}; - private _priorStyles:{}; - private _priorStyles2:{}; + // #docregion evil-title + evilTitle = 'Template Syntax'; + // #enddocregion evil-title - getStyles(el:Element){ + title = 'Template Syntax'; + + // DevMode memoization fields + private priorClasses: {}; + private _priorStyles: {}; + + getStyles(el: Element) { let styles = window.getComputedStyle(el); let showStyles = {}; - for (var p in this.setStyles()){ + for (let p in this.setStyles()) { showStyles[p] = styles[p]; } return JSON.stringify(showStyles); } - getVal() {return this.val}; + getVal() { return this.val; } - heroes:Hero[]; + heroes: Hero[]; // heroImageUrl = 'http://www.wpclipart.com/cartoon/people/hero/hero_silhoutte_T.png'; // Public Domain terms of use: http://www.wpclipart.com/terms.html heroImageUrl = 'images/hero.png'; - //iconUrl = 'https://angular.io/resources/images/logos/standard/shield-large.png'; + // iconUrl = 'https://angular.io/resources/images/logos/standard/shield-large.png'; clicked = ''; clickMessage = ''; clickMessage2 = ''; @@ -85,28 +91,28 @@ export class AppComponent implements AfterViewInit, OnInit { isSpecial = true; isUnchanged = true; - nullHero:Hero = null; // or undefined + nullHero: Hero = null; // or undefined - onCancel(event:KeyboardEvent){ - let evtMsg = event ? ' Event target is '+ (event.target).innerHTML : ''; - this.alert('Canceled.'+evtMsg) + onCancel(event: KeyboardEvent) { + let evtMsg = event ? ' Event target is ' + (event.target).innerHTML : ''; + this.alert('Canceled.' + evtMsg); } - onClickMe(event:KeyboardEvent){ - let evtMsg = event ? ' Event target class is '+ (event.target).className : ''; - this.alert('Click me.'+evtMsg) + onClickMe(event: KeyboardEvent) { + let evtMsg = event ? ' Event target class is ' + (event.target).className : ''; + this.alert('Click me.' + evtMsg); } - onSave(event:KeyboardEvent){ - let evtMsg = event ? ' Event target is '+ (event.target).innerText : ''; - this.alert('Saved.'+evtMsg) + onSave(event: KeyboardEvent) { + let evtMsg = event ? ' Event target is ' + (event.target).innerText : ''; + this.alert('Saved.' + evtMsg); } - onSubmit(form:NgForm){ + onSubmit(form: NgForm) { let evtMsg = form.valid ? - ' Form value is '+ JSON.stringify(form.value) : + ' Form value is ' + JSON.stringify(form.value) : ' Form is invalid'; - this.alert('Form submitted.'+evtMsg) + this.alert('Form submitted.' + evtMsg); } product = { @@ -123,10 +129,10 @@ export class AppComponent implements AfterViewInit, OnInit { // #docregion same-as-it-ever-was private samenessCount = 5; - moreOfTheSame() {this.samenessCount++;}; + moreOfTheSame() { this.samenessCount++; }; get sameAsItEverWas() { - var result:string[] = Array(this.samenessCount); - for (var i=result.length; i-- > 0;){result[i]='same as it ever was ...'} + let result: string[] = Array(this.samenessCount); + for ( let i = result.length; i-- > 0; ) { result[i] = 'same as it ever was ...'; } return result; // return [1,2,3,4,5].map(id => { // return {id:id, text: 'same as it ever was ...'}; @@ -134,8 +140,8 @@ export class AppComponent implements AfterViewInit, OnInit { } // #enddocregion same-as-it-ever-was - setUpperCaseFirstName(firstName:string){ - //console.log(firstName); + setUpperCaseFirstName(firstName: string) { + // console.log(firstName); this.currentHero.firstName = firstName.toUpperCase(); } @@ -145,10 +151,10 @@ export class AppComponent implements AfterViewInit, OnInit { saveable: this.canSave, // true modified: !this.isUnchanged, // false special: this.isSpecial, // true - } + }; // #enddocregion setClasses // compensate for DevMode (sigh) - if (JSON.stringify(classes) === JSON.stringify(this.priorClasses)){ + if (JSON.stringify(classes) === JSON.stringify(this.priorClasses)) { return this.priorClasses; } this.priorClasses = classes; @@ -165,10 +171,10 @@ export class AppComponent implements AfterViewInit, OnInit { 'font-style': this.canSave ? 'italic' : 'normal', // italic 'font-weight': !this.isUnchanged ? 'bold' : 'normal', // normal 'font-size': this.isSpecial ? '24px' : '8px', // 24px - } + }; // #enddocregion setStyles // compensate for DevMode (sigh) - if (JSON.stringify(styles) === JSON.stringify(this._priorStyles)){ + if (JSON.stringify(styles) === JSON.stringify(this._priorStyles)) { return this._priorStyles; } this._priorStyles = styles; @@ -178,15 +184,14 @@ export class AppComponent implements AfterViewInit, OnInit { // #enddocregion setStyles toeChoice = ''; - toeChooser(picker:HTMLFieldSetElement){ + toeChooser(picker: HTMLFieldSetElement) { let choices = picker.children; - for (let i=0; ichoices[i]; - if (choice.checked) {return this.toeChoice = choice.value} + for (let i = 0; i < choices.length; i++) { + let choice = choices[i]; + if (choice.checked) {return this.toeChoice = choice.value; } } } - title = 'Template Syntax'; // #docregion trackByHeroes trackByHeroes(index: number, hero: Hero) { return hero.id; } @@ -196,18 +201,18 @@ export class AppComponent implements AfterViewInit, OnInit { trackById(index: number, item: any): string { return item['id']; } // #enddocregion trackById - val=2; - // villainImageUrl = 'http://www.clker.com/cliparts/u/s/y/L/x/9/villain-man-hi.png' + val = 2; + // villainImageUrl = 'http://www.clker.com/cliparts/u/s/y/L/x/9/villain-man-hi.png' // Public Domain terms of use http://www.clker.com/disclaimer.html - villainImageUrl = 'images/villain.png' + villainImageUrl = 'images/villain.png'; //////// Detect effects of NgForTrackBy /////////////// - @ViewChildren('noTrackBy') childrenNoTrackBy:QueryList; - @ViewChildren('withTrackBy') childrenWithTrackBy:QueryList; + @ViewChildren('noTrackBy') childrenNoTrackBy: QueryList; + @ViewChildren('withTrackBy') childrenWithTrackBy: QueryList; - private _oldNoTrackBy:HTMLElement[]; - private _oldWithTrackBy:HTMLElement[]; + private _oldNoTrackBy: HTMLElement[]; + private _oldWithTrackBy: HTMLElement[]; heroesNoTrackByChangeCount = 0; heroesWithTrackByChangeCount = 0; @@ -216,32 +221,32 @@ export class AppComponent implements AfterViewInit, OnInit { this._oldNoTrackBy = toArray(this.childrenNoTrackBy); this._oldWithTrackBy = toArray(this.childrenWithTrackBy); - this.childrenNoTrackBy.changes.subscribe((changes:any) => { + this.childrenNoTrackBy.changes.subscribe((changes: any) => { let newNoTrackBy = toArray(changes); - let isSame = this._oldNoTrackBy.every((v:any, i:number) => v === newNoTrackBy[i]); + let isSame = this._oldNoTrackBy.every((v: any, i: number) => v === newNoTrackBy[i]); if (!isSame) { this._oldNoTrackBy = newNoTrackBy; this.heroesNoTrackByChangeCount++; } - }) + }); - this.childrenWithTrackBy.changes.subscribe((changes:any) => { + this.childrenWithTrackBy.changes.subscribe((changes: any) => { let newWithTrackBy = toArray(changes); - let isSame = this._oldWithTrackBy.every((v:any, i:number) => v === newWithTrackBy[i]); + let isSame = this._oldWithTrackBy.every((v: any, i: number) => v === newWithTrackBy[i]); if (!isSame) { this._oldWithTrackBy = newWithTrackBy; this.heroesWithTrackByChangeCount++; } - }) + }); } /////////////////// } // helper to convert viewChildren to an array of HTMLElements -function toArray(viewChildren:QueryList) { +function toArray(viewChildren: QueryList) { let result: HTMLElement[] = []; let children = viewChildren.toArray()[0].nativeElement.children; - for (var i = 0; i < children.length; i++) { result.push(children[i]); } + for (let i = 0; i < children.length; i++) { result.push(children[i]); } return result; } diff --git a/public/docs/ts/latest/guide/template-syntax.jade b/public/docs/ts/latest/guide/template-syntax.jade index 9f1e008a79..dbf8281515 100644 --- a/public/docs/ts/latest/guide/template-syntax.jade +++ b/public/docs/ts/latest/guide/template-syntax.jade @@ -568,7 +568,8 @@ a(id="one-time-initialization") The `[hero]` binding, on the other hand, remains a live binding to the component's `currentHero` property. ### Property binding or interpolation? - We often have a choice between interpolation and property binding. The following binding pairs do the same thing: + We often have a choice between interpolation and property binding. + The following binding pairs do the same thing: +makeExample('template-syntax/ts/app/app.component.html', 'property-binding-vs-interpolation')(format=".") :marked Interpolation is a convenient alternative for property binding in many cases. @@ -580,6 +581,23 @@ a(id="one-time-initialization") We suggest establishing coding style rules and choosing the form that both conforms to the rules and feels most natural for the task at hand. + +:marked + #### Content Security + Imagine the following *malicious content*. ++makeExample('template-syntax/ts/app/app.component.ts', 'evil-title')(format=".") +:marked + Fortunately, Angular data binding is on alert for dangerous HTML. + It *sanitizes* the values before displaying them. + It **will not** allow HTML with script tags to leak into the browser, neither with interpolation + nor property binding. ++makeExample('template-syntax/ts/app/app.component.html', 'property-binding-vs-interpolation-sanitization')(format=".") +:marked + Interpolation handles the script tags differently than property binding but both approaches render the + content harmlessly. +figure.image-display + img(src='/resources/images/devguide/template-syntax/evil-title.png' alt="evil title made safe" width='500px') + .l-main-section :marked diff --git a/public/resources/images/devguide/template-syntax/evil-title.png b/public/resources/images/devguide/template-syntax/evil-title.png new file mode 100644 index 0000000000000000000000000000000000000000..9c67d7189457aff7d8750ed1bef3f191fd34d637 GIT binary patch literal 32206 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 literal 0 HcmV?d00001