Ich möchte das Hintergrundbild eines DIV in einer Komponentenvorlage in meiner Angular 2-App festlegen. Ich erhalte jedoch immer wieder die folgende Warnung in meiner Konsole und erhalte nicht den gewünschten Effekt ... Ich bin mir nicht sicher, ob das dynamische CSS-Hintergrundbild aufgrund von Sicherheitsbeschränkungen in Angular2 blockiert wird oder ob meine HTML-Vorlage beschädigt ist.
Dies ist die Warnung, die ich in meiner Konsole sehe (ich habe meine IMG-URL geändert in /img/path/is/correct.png
:
WARNUNG: Bereinigen der URL eines unsicheren Stilwerts (SafeValue muss [property] = binding: /img/path/is/correct.png verwenden (siehe http://g.co/ng/security#xss )) (siehe http: // g.co/ng/security#xss ).
Die Sache ist, dass ich mit dem DomSanitizationService
in Angular2 bereinige, was in meine Vorlage injiziert wird. Hier ist mein HTML, das ich in meiner Vorlage habe:
<div>
<div>
<div class="header"
*ngIf="image"
[style.background-image]="'url(' + image + ')'">
</div>
<div class="zone">
<div>
<div>
<h1 [innerHTML]="header"></h1>
</div>
<div class="zone__content">
<p
*ngFor="let contentSegment of content"
[innerHTML]="contentSegment"></p>
</div>
</div>
</div>
</div>
</div>
Hier ist die Komponente ...
Import {
DomSanitizationService,
SafeHtml,
SafeUrl,
SafeStyle
} from '@angular/platform-browser';
@Component({
selector: 'example',
templateUrl: 'src/content/example.component.html'
})
export class CardComponent implements OnChanges {
public header:SafeHtml;
public content:SafeHtml[];
public image:SafeStyle;
public isActive:boolean;
public isExtended:boolean;
constructor(private sanitization:DomSanitizationService) {
}
ngOnChanges():void {
map(this.element, this);
function map(element:Card, instance:CardComponent):void {
if (element) {
instance.header = instance.sanitization.bypassSecurityTrustHtml(element.header);
instance.content = _.map(instance.element.content, (input:string):SafeHtml => {
return instance.sanitization.bypassSecurityTrustHtml(input);
});
if (element.image) {
/* Here is the problem... I have also used bypassSecurityTrustUrl */
instance.image = instance.sanitization.bypassSecurityTrustStyle(element.image);
} else {
instance.image = null;
}
}
}
}
}
Bitte beachten Sie, dass, wenn ich gerade mit [src] = "image" an die Vorlage gebunden habe, zum Beispiel:
<div *ngIf="image">
<img [src]="image">
</div>
und image
wurde mit bypassSecurityTrustUrl
allem bestanden, schien gut zu funktionieren ... kann jemand sehen, was ich falsch mache?
quelle
Antworten:
Sie müssen die gesamte
url
Anweisung in Folgendes einschließenbypassSecurityTrustStyle
:Und haben
Andernfalls wird es nicht als gültige Stileigenschaft angesehen
quelle
Verwenden Sie dies, um
<div [ngStyle]="{'background-image':'url('+imageUrl+')'}"></div>
das Problem für mich zu lösen.quelle
Wenn Hintergrundbild mit linearem Farbverlauf (
*ngFor
)Aussicht:
Klasse:
quelle
thumbnailMediumIcon = this.sanitizer.bypassSecurityTrustUrl(
URL ($ {thumbnail}))
und[style.backgroundImage]="thumbnailMediumIcon"
. Welche Angular-Version haben Sie verwendet? Ich habe auch versucht, Hintergrundbild. Funktioniert das noch Ich mag den anderen Ansatz nicht?thumbnail
) anstelle einer URL übergebengetBackground
innerhalb der Ansicht aufzurufen , da AngularbypassSecurityTrustStyle
jedes Mal aufrufen muss, wenn diese Ansicht aktualisiert wird. Um dies zu testen, fügen Sie console.log hinzugetBackground
und Sie werden sehen, dass die Funktion bei jedem Klick oder Benutzer-Scroll-Ereignis aufgerufen wirdÜberprüfen Sie dieses handliche Rohr auf Angular2: Verwendung:
in dem
SafePipe
Code, ersetzenDomSanitizationService
mitDomSanitizer
Geben Sie das an,
SafePipe
wenn IhrNgModule
<div [style.background-image]="'url(' + your_property + ')' | safe: 'style'"></div>
quelle
Basierend auf den Dokumenten unter https://angular.io/api/platform-browser/DomSanitizer scheint der richtige Weg, dies zu tun, die Verwendung von sanitize zu sein. Zumindest in Angular 7 (weiß nicht, ob sich dies gegenüber zuvor geändert hat). Das hat bei mir funktioniert:
Zu SecurityContext siehe https://angular.io/api/core/SecurityContext . Im Grunde ist es nur diese Aufzählung:
quelle
this.sanitizer.bypassSecurityTrustStyle(`url('${this.image} ')`);
bypassSecurityTrustStyle
ignoriert die Sicherheit undsanitize(SecurityContext.STYLE, style)
erhöht die Sicherheit. Ich würde empfehlen,sanitize
mit dem entsprechenden zu verwendenSecurityContext
.bypassSecurityTrustStyle
gibt ein Objekt zurück, auf das nicht zugegriffen werden kann (zumindest konnte ich es nicht tun)[ngStyle]
.sanitize(SecurityContext.STYLE, style)
Gibt stattdessen eine einfache Zeichenfolge zurück.bypassSecurityTrustStyle
ist im Grunde brutal es zu erzwingen.Ich habe das gleiche Problem beim Hinzufügen einer dynamischen URL im Image-Tag in Angular 7 erhalten. Ich habe viel gesucht und diese Lösung gefunden.
Schreiben Sie zunächst den folgenden Code in die Komponentendatei.
Jetzt können Sie in Ihrem HTML-Bild-Tag so schreiben.
Sie können gemäß Ihren Anforderungen anstelle von item.imageUrl schreiben
Ich habe eine Referenz von dieser Seite bekommen. dynamische URLs . Hoffe diese Lösung wird dir helfen :)
quelle
Es gibt ein offenes Problem, bei dem diese Warnung nur gedruckt werden kann, wenn tatsächlich etwas bereinigt wurde: https://github.com/angular/angular/pull/10272
Ich habe nicht im Detail gelesen, wann diese Warnung gedruckt wurde, als nichts bereinigt wurde.
quelle
Für alle, die bereits das tun, was die Warnung vorschlägt, musste ich vor dem Upgrade auf Angular 5 meine
SafeStyle
Typen zuordnen, bevor ichstring
sie in den Vorlagen verwenden konnte. Nach Angular 5 ist dies nicht mehr der Fall. Ich musste meine Modelle ändern, um eineimage: SafeStyle
statt zu habenimage: string
. Ich habe bereits die[style.background-image]
Eigenschaftsbindung verwendet und die Sicherheit für die gesamte URL umgangen.Hoffe das hilft jemandem.
quelle
Da Angular keine dedizierte Desinfektionsbibliothek ist, ist es gegenüber verdächtigen Inhalten übereifrig, kein Risiko einzugehen. Sie können die Bereinigung an eine dedizierte Bibliothek delegieren, z. B. DOMPurify. Hier ist eine Wrapper-Bibliothek, die ich erstellt habe, um DOMPurify mit Angular einfach zu verwenden.
https://github.com/TinkoffCreditSystems/ng-dompurify
Es hat eine Pipe, um HTML deklarativ zu bereinigen:
Eine Sache, die Sie beachten sollten, ist, dass DOMPurify sich hervorragend zum Bereinigen von HTML / SVG eignet, nicht jedoch von CSS. So können Sie Angulars CSS-Desinfektionsmittel für CSS bereitstellen:
Es ist ein internes
ɵ
Präfix - hense , aber so verwendet es das Angular-Team sowieso auch für seine eigenen Pakete.quelle
In meinem Fall habe ich die Bild-URL erhalten, bevor ich zur Anzeigekomponente gelangt bin, und möchte sie als Hintergrundbild verwenden. Um diese URL zu verwenden, muss ich Angular mitteilen, dass sie sicher ist und verwendet werden kann.
In der .ts-Datei
In der HTML-Datei
quelle