Quero definir a imagem de plano de fundo de um DIV em um modelo de componente em meu aplicativo Angular 2. No entanto, continuo recebendo o seguinte aviso em meu console e não obtenho o efeito desejado ... Não tenho certeza se a imagem de plano de fundo do CSS dinâmico está sendo bloqueada devido a restrições de segurança no Angular2 ou se meu modelo HTML está quebrado.
Este é o aviso que vejo em meu console (mudei meu url img para /img/path/is/correct.png
:
AVISO: higienizando url de valor de estilo inseguro (SafeValue deve usar [propriedade] = binding: /img/path/is/correct.png (consulte http://g.co/ng/security#xss )) (consulte http: // g.co/ng/security#xss ).
O que acontece é que eu limpo o que é injetado no meu modelo usando o DomSanitizationService
Angular2. Aqui está o meu HTML que tenho em meu modelo:
<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>
Aqui está o componente ...
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;
}
}
}
}
}
Observe que quando acabei de vincular ao modelo usando [src] = "imagem", por exemplo:
<div *ngIf="image">
<img [src]="image">
</div>
e image
passou usando bypassSecurityTrustUrl
tudo parecia funcionar bem ... alguem pode ver o que estou fazendo de errado?
fonte
Respostas:
Você tem que envolver toda a
url
instrução embypassSecurityTrustStyle
:E tem
Caso contrário, não é visto como uma propriedade de estilo válida
fonte
Use isso para
<div [ngStyle]="{'background-image':'url('+imageUrl+')'}"></div>
resolver o problema para mim.fonte
Se a imagem de fundo com gradiente linear (
*ngFor
)Visão:
Classe:
fonte
thumbnailMediumIcon = this.sanitizer.bypassSecurityTrustUrl(
url ($ {thumbnail}))
e[style.backgroundImage]="thumbnailMediumIcon"
. Qual versão Angular você usou? Eu também tentei background-image. Ainda está funcionando? Eu não gosto da outra abordagem?thumbnail
) em vez de um URLgetBackground
dentro da vista, porque o Angular tem que chamarbypassSecurityTrustStyle
cada vez que a vista é atualizada. Para testar isso, adicione console.log dentrogetBackground
e você verá que a função é chamada a cada clique ou evento de rolagem do usuárioVerifique este tubo útil para Angular2: Uso:
no
SafePipe
código, substituaDomSanitizationService
porDomSanitizer
forneça
SafePipe
se o seuNgModule
<div [style.background-image]="'url(' + your_property + ')' | safe: 'style'"></div>
fonte
Com base na documentação em https://angular.io/api/platform-browser/DomSanitizer , a maneira certa de fazer isso parece ser usando sanitize. Pelo menos no Angular 7 (não sei se mudou desde antes). Isso funcionou para mim:
Sobre SecurityContext, consulte https://angular.io/api/core/SecurityContext . Basicamente, é apenas este enum:
fonte
this.sanitizer.bypassSecurityTrustStyle(`url('${this.image} ')`);
bypassSecurityTrustStyle
ignora a segurança enquantosanitize(SecurityContext.STYLE, style)
reforça a segurança. Eu recomendaria usarsanitize
com o apropriadoSecurityContext
.bypassSecurityTrustStyle
retorna um objeto que não pode ser acessado (pelo menos eu não poderia fazer isso) em[ngStyle]
.sanitize(SecurityContext.STYLE, style)
em vez disso, retorna uma string simples.bypassSecurityTrustStyle
é basicamente força bruta.Eu tive o mesmo problema ao adicionar url dinâmico na tag de imagem no Angular 7. Eu pesquisei muito e encontrei essa solução.
Primeiro, escreva o código abaixo no arquivo do componente.
Agora, em sua tag de imagem html, você pode escrever assim.
Você pode escrever conforme sua necessidade em vez de item.imageUrl
Eu tenho uma referência deste site. urls dinâmicas . Espero que esta solução ajude você :)
fonte
Há um problema em aberto para imprimir este aviso apenas se realmente houver algo higienizado: https://github.com/angular/angular/pull/10272
Não li em detalhes quando este aviso é impresso quando nada foi higienizado.
fonte
Para quem já está fazendo o que o aviso sugere que você faça, antes da atualização para o Angular 5, tive que mapear meus
SafeStyle
tiposstring
antes de usá-los nos modelos. Depois do Angular 5, esse não é mais o caso. Tive que mudar meus modelos para ter um emimage: SafeStyle
vez deimage: string
. Eu já estava usando a[style.background-image]
vinculação de propriedade e contornando a segurança em todo o url.Espero que isso ajude alguém.
fonte
Como o Angular não é uma biblioteca de higienização dedicada, é muito zeloso com conteúdo suspeito para não correr riscos. Você pode delegar a higienização a uma biblioteca dedicada, por exemplo - DOMPurify. Aqui está uma biblioteca de wrapper que criei para usar facilmente DOMPurify com Angular.
https://github.com/TinkoffCreditSystems/ng-dompurify
Ele tem um tubo para higienizar declarativamente o HTML:
Uma coisa a se ter em mente é que o DOMPurify é ótimo para limpar HTML / SVG, mas não CSS. Portanto, você pode fornecer o sanitizer CSS da Angular para lidar com CSS:
É um
ɵ
prefixo interno - hense , mas é assim que a equipe Angular também o usa em seus próprios pacotes.fonte
No meu caso, obtive o URL da imagem antes de chegar ao componente de exibição e quero usá-lo como imagem de plano de fundo, então, para usar esse URL, preciso dizer ao Angular que é seguro e pode ser usado.
No arquivo .ts
Em arquivo .html
fonte