Je souhaite définir l'image d'arrière-plan d'une DIV dans un modèle de composant dans mon application Angular 2. Cependant, je continue à recevoir l'avertissement suivant dans ma console et je n'obtiens pas l'effet souhaité ... Je ne sais pas si l'image d'arrière-plan CSS dynamique est bloquée en raison de restrictions de sécurité dans Angular2 ou si mon modèle HTML est cassé.
C'est l'avertissement que je vois dans ma console (j'ai changé mon URL d'img en /img/path/is/correct.png
:
AVERTISSEMENT: nettoyage de l'url de la valeur de style unsafe (SafeValue doit utiliser [property] = binding: /img/path/is/correct.png (voir http://g.co/ng/security#xss )) (voir http: // g.co/ng/security#xss ).
Le fait est que je désinfecte ce qui est injecté dans mon modèle en utilisant le DomSanitizationService
dans Angular2. Voici mon HTML que j'ai dans mon modèle:
<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>
Voici le composant ...
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;
}
}
}
}
}
Veuillez noter que lorsque je viens de me connecter au modèle en utilisant [src] = "image", par exemple:
<div *ngIf="image">
<img [src]="image">
</div>
et a image
été adopté en utilisant bypassSecurityTrustUrl
tout semblait bien fonctionner ... quelqu'un peut-il voir ce que je fais mal?
la source
Réponses:
Vous devez envelopper l'ensemble de l'
url
instruction dans lebypassSecurityTrustStyle
:Et avoir
Sinon, il n'est pas considéré comme une propriété de style valide
la source
Utilisez ceci,
<div [ngStyle]="{'background-image':'url('+imageUrl+')'}"></div>
cela a résolu le problème pour moi.la source
Si l'image d'arrière-plan avec gradient linéaire (
*ngFor
)Vue:
Classe:
la source
thumbnailMediumIcon = this.sanitizer.bypassSecurityTrustUrl(
url ($ {miniature}))
et[style.backgroundImage]="thumbnailMediumIcon"
. Quelle version angulaire avez-vous utilisée? J'ai aussi essayé l'image d'arrière-plan. Cela fonctionne-t-il toujours? Je n'aime pas l'autre approche?thumbnail
) au lieu d'une URLgetBackground
à l'intérieur de la vue, car Angular doit appelerbypassSecurityTrustStyle
chaque fois que cette vue est actualisée. Pour tester cela, ajoutez console.log à l'intérieurgetBackground
et vous verrez que la fonction est appelée à chaque clic ou événement de défilement utilisateurVérifiez ce tuyau pratique pour Angular2: Utilisation:
dans le
SafePipe
code, remplacezDomSanitizationService
parDomSanitizer
fournir le
SafePipe
si votreNgModule
<div [style.background-image]="'url(' + your_property + ')' | safe: 'style'"></div>
la source
Sur la base des documents disponibles sur https://angular.io/api/platform-browser/DomSanitizer , la bonne façon de procéder semble être d'utiliser sanitize. Au moins dans Angular 7 (je ne sais pas si cela a changé par rapport à avant). Cela a fonctionné pour moi:
Re SecurityContext, voir https://angular.io/api/core/SecurityContext . Fondamentalement, c'est juste cette énumération:
la source
this.sanitizer.bypassSecurityTrustStyle(`url('${this.image} ')`);
bypassSecurityTrustStyle
ignore la sécurité tout ensanitize(SecurityContext.STYLE, style)
renforçant la sécurité. Je recommanderais d'utilisersanitize
avec le appropriéSecurityContext
.bypassSecurityTrustStyle
renvoie un objet auquel il est impossible d'accéder (du moins je ne pouvais pas le faire) dans[ngStyle]
.sanitize(SecurityContext.STYLE, style)
renvoie à la place une chaîne simple.bypassSecurityTrustStyle
est fondamentalement le forçant brutalement.J'ai eu le même problème en ajoutant une URL dynamique dans la balise Image dans Angular 7. J'ai beaucoup cherché et trouvé cette solution.
Tout d'abord, écrivez le code ci-dessous dans le fichier du composant.
Maintenant, dans votre balise d'image html, vous pouvez écrire comme ça.
Vous pouvez écrire selon vos besoins au lieu de item.imageUrl
J'ai eu une référence sur ce site. URL dynamiques . J'espère que cette solution vous aidera :)
la source
Il existe un problème ouvert pour n'imprimer cet avertissement que s'il y avait réellement quelque chose de désinfecté: https://github.com/angular/angular/pull/10272
Je n'ai pas lu en détail quand cet avertissement est imprimé alors que rien n'a été désinfecté.
la source
Pour tous ceux qui font déjà ce que l'avertissement vous suggère de faire, avant la mise à niveau vers Angular 5, je devais mapper mes
SafeStyle
typesstring
avant de les utiliser dans les modèles. Après Angular 5, ce n'est plus le cas. J'ai dû changer mes modèles pour avoir uneimage: SafeStyle
place deimage: string
. J'utilisais déjà la[style.background-image]
propriété binding et contournais la sécurité sur toute l'url.J'espère que cela aide quelqu'un.
la source
Comme Angular n'est pas une bibliothèque de désinfection dédiée, il est trop zélé envers les contenus suspects de ne prendre aucun risque. Vous pouvez déléguer le nettoyage à une bibliothèque dédiée, par exemple - DOMPurify. Voici une bibliothèque de wrapper que j'ai créée pour utiliser facilement DOMPurify avec Angular.
https://github.com/TinkoffCreditSystems/ng-dompurify
Il a un tube pour nettoyer le HTML de manière déclarative:
Une chose à garder à l'esprit est que DOMPurify est idéal pour nettoyer HTML / SVG, mais pas CSS. Vous pouvez donc fournir le désinfectant CSS d'Angular pour gérer les CSS:
C'est interne -
ɵ
préfixe hense , mais c'est ainsi que l'équipe Angular l'utilise également dans ses propres packages.la source
Dans mon cas, j'ai obtenu l'URL de l'image avant d'accéder au composant d'affichage et je souhaite l'utiliser comme image d'arrière-plan.Pour utiliser cette URL, je dois dire à Angular qu'elle est sûre et peut être utilisée.
Dans le fichier .ts
Dans un fichier .html
la source