Ich habe eine textarea
, wo der Benutzer Text eingeben wird. Der Text darf nicht aus JavaScript oder HTML bestehen. Ich möchte die Daten manuell bereinigen und in einem String speichern.
Ich kann nicht herausfinden, wie man mit DomSanitizationService
meine Daten manuell bereinigt.
Wenn ich {{ textare_text }}
auf der Seite mache, werden die Daten korrekt bereinigt.
Wie mache ich das manuell mit einem string
, das ich habe?
Sie können den HTML-Code folgendermaßen bereinigen:
import { Component, SecurityContext } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
@Component({
selector: 'my-app',
template: `
<div [innerHTML]="_htmlProperty"></div>
`
})
export class AppComponent {
_htmlProperty: string = 'AAA<input type="text" name="name">BBB';
constructor(private _sanitizer: DomSanitizer){ }
public get htmlProperty() : SafeHtml {
return this._sanitizer.sanitize(SecurityContext.HTML, this._htmlProperty);
}
}
Aus Ihren Kommentaren möchten Sie eigentlich der Desinfektion entgehen .
Dazu überprüfen Sie diesen Plunker, wo wir sowohl Flucht als auch Desinfektion haben .
import { Component, SecurityContext } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
@Component({
selector: 'my-app',
template: `Original, using interpolation (double curly braces):<b>
<div>{{ _originalHtmlProperty }}</div>
</b><hr>Sanitized, used as innerHTML:<b>
<div [innerHTML]="sanitizedHtmlProperty"></div>
</b><hr>Escaped, used as innerHTML:<b>
<div [innerHTML]="escapedHtmlProperty"></div>
</b><hr>Escaped AND sanitized used as innerHTML:<b>
<div [innerHTML]="escapedAndSanitizedHtmlProperty"></div>
</b>`
})
export class AppComponent {
_originalHtmlProperty: string = 'AAA<input type="text" name="name">BBB';
constructor(private _sanitizer: DomSanitizer){ }
public get sanitizedHtmlProperty() : SafeHtml {
return this._sanitizer.sanitize(SecurityContext.HTML, this._originalHtmlProperty);
}
public get escapedHtmlProperty() : string {
return this.escapeHtml(this._originalHtmlProperty);
}
public get escapedAndSanitizedHtmlProperty() : string {
return this._sanitizer.sanitize(SecurityContext.HTML, this.escapeHtml(this._originalHtmlProperty));
}
escapeHtml(unsafe) {
return unsafe.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")
.replace(/"/g, """).replace(/'/g, "'");
}
}
Die oben verwendete HTML-Escape-Funktion maskiert die gleichen Zeichen wie Winkelcode (Leider ist ihre Escape-Funktion nicht öffentlich, daher können wir sie nicht verwenden).
In Angular final kannst du so verwenden:
Erster Import von "DomSanitizer" aus dem Winkel-Plattform-Browser:
import { DomSanitizer } from '@angular/platform-browser';
import { SecurityContext } from '@angular/core';
Dann im Konstruktor:
constructor(private _sanitizer: DomSanitizer){}
Dann verwenden Sie in Ihrer Klasse wie:
var title = "<script> alert('Hello')</script>"
title = this._sanitizer.sanitize(SecurityContext.HTML, title);
In Winkel ^ 2.3.1
Eine Ansicht mit einer bootstrap4-Fortschrittsleiste haben. Im Beispiel benötigen wir einen Wert für style.width.
<!-- View HTML-->
<div class="progress">
<div class="progress-bar" role="progressbar" [style.width]="getProgress('style')" aria-valuenow="getProgress()" aria-valuemin="0" aria-valuemax="100"></div>
</div>
Wir müssen diesen style.width -Wert desinfizieren. Wir müssen DomSanitizer für sanitize den Wert und SecurityContext verwenden, um den Kontext anzugeben. In diesem Beispiel lautet der Kontext style .
// note that we need to use SecurityContext and DomSanitizer
// SecurityContext.STYLE
import { Component, OnInit, Input } from '@angular/core';
import { SecurityContext} from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
@Component({
selector: 'app-challenge-progress',
templateUrl: './challenge-progress.component.html',
styleUrls: ['./challenge-progress.component.sass']
})
export class ChallengeProgressComponent implements OnInit {
@Input() data: any;
constructor(private _sanitizer: DomSanitizer) { }
ngOnInit() {
}
getProgress(type: string): any {
if(type === 'style') {
// here is the line you are looking for
return this._sanitizer.sanitize(SecurityContext.STYLE,this._getProgress()+'%');
}
return this._getProgress();
}
private _getProgress():number {
if(this.data) {
return this.data.goal_total_current/this.data.goal*100;
}
return 0;
}
}