Я хочу установить фоновое изображение DIV в шаблоне компонента в моем приложении Angular 2. Однако я продолжаю получать следующее предупреждение в моей консоли, и я не получаю желаемого эффекта ... Я не уверен, блокируется ли динамическое фоновое изображение CSS из-за ограничений безопасности в Angular2 или мой шаблон HTML не работает.
Это предупреждение, которое я вижу на своей консоли (я изменил свой URL-адрес img на /img/path/is/correct.png
:
ПРЕДУПРЕЖДЕНИЕ: дезинфицирующий небезопасным значение типа URL (SafeValue должны использовать [свойство] = связывание: /img/path/is/correct.png (см http://g.co/ng/security#xss )) (см Http: // g.co/ng/security#xss ).
Дело в том, что я дезинфицирую то, что вводится в мой шаблон, с помощью DomSanitizationService
метода Angular2. Вот мой HTML-код в моем шаблоне:
<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>
Вот компонент ...
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;
}
}
}
}
}
Обратите внимание, когда я просто привязался к шаблону, используя [src] = "image", например:
<div *ngIf="image">
<img [src]="image">
</div>
и image
прошел, используя bypassSecurityTrustUrl
все, казалось, работает хорошо ... может ли кто-нибудь увидеть, что я делаю не так?
источник
Ответы:
Вы должны обернуть весь
url
оператор вbypassSecurityTrustStyle
:И имеют
В противном случае это не рассматривается как допустимое свойство стиля.
источник
Используйте это, чтобы
<div [ngStyle]="{'background-image':'url('+imageUrl+')'}"></div>
решить проблему для меня.источник
Если фоновое изображение с linear-gradient (
*ngFor
)Посмотреть:
Класс:
источник
thumbnailMediumIcon = this.sanitizer.bypassSecurityTrustUrl(
url ($ {thumbnail}))
и[style.backgroundImage]="thumbnailMediumIcon"
. Какую версию Angular вы использовали? Я также пробовал фоновое изображение. Это все еще работает? Мне не нравится другой подход?thumbnail
) вместо URLgetBackground
внутри представления, потому что Angular должен вызыватьbypassSecurityTrustStyle
каждый раз, когда это представление обновляется. Чтобы проверить это, добавьте console.log внутрь,getBackground
и вы увидите, что эта функция вызывается при каждом щелчке или событии прокрутки пользователяПроверьте этот удобный канал для Angular2: Использование:
в
SafePipe
коде заменитеDomSanitizationService
наDomSanitizer
предоставьте,
SafePipe
если вашNgModule
<div [style.background-image]="'url(' + your_property + ')' | safe: 'style'"></div>
источник
Судя по документации на https://angular.io/api/platform-browser/DomSanitizer , правильным способом сделать это, по-видимому, является использование sanitize. По крайней мере, в Angular 7 (не знаю, изменилось ли это раньше). Это сработало для меня:
По поводу SecurityContext см. Https://angular.io/api/core/SecurityContext . В основном это просто перечисление:
источник
this.sanitizer.bypassSecurityTrustStyle(`url('${this.image} ')`);
bypassSecurityTrustStyle
игнорирует безопасность, ноsanitize(SecurityContext.STYLE, style)
усиливает безопасность. Я бы рекомендовал использоватьsanitize
с соответствующимиSecurityContext
.bypassSecurityTrustStyle
возвращает объект, к которому нельзя получить доступ (по крайней мере, я не мог этого сделать) в[ngStyle]
.sanitize(SecurityContext.STYLE, style)
вместо этого возвращает простую строку.bypassSecurityTrustStyle
это в основном грубое принуждение.У меня возникла та же проблема при добавлении динамического URL-адреса в тег изображения в Angular 7. Я много искал и нашел это решение.
Сначала напишите код ниже в файле компонента.
Теперь в теге изображения html вы можете написать вот так.
Вы можете писать в соответствии с вашими требованиями вместо item.imageUrl
Получил ссылку с этого сайта. динамические URL-адреса . Надеюсь, это решение вам поможет :)
источник
Существует нерешенная проблема, заключающаяся в том, чтобы распечатать это предупреждение только в том случае, если что-то действительно было продезинфицировано: https://github.com/angular/angular/pull/10272
Я не читал подробно, когда печатается это предупреждение, когда ничего не было продезинфицировано.
источник
Для всех, кто уже делает то, что вам предлагает предупреждение, перед обновлением до Angular 5 мне пришлось сопоставить свои
SafeStyle
типы,string
прежде чем использовать их в шаблонах. После Angular 5 это уже не так. Мне пришлось поменять модели, чтобыimage: SafeStyle
вместоimage: string
. Я уже использовал[style.background-image]
привязку свойств и обход безопасности по всему URL-адресу.Надеюсь, это кому-то поможет.
источник
Поскольку Angular не является специальной библиотекой для очистки, она слишком ревностно относится к подозрительному контенту, чтобы не рисковать. Вы можете делегировать дезинфекцию в специальную библиотеку, например, DOMPurify. Вот библиотека-оболочка, которую я сделал, чтобы легко использовать DOMPurify с Angular.
https://github.com/TinkoffCreditSystems/ng-dompurify
У него есть канал для декларативной дезинфекции HTML:
Следует иметь в виду, что DOMPurify отлично подходит для очистки HTML / SVG, но не CSS. Таким образом, вы можете предоставить дезинфицирующее средство CSS Angular для обработки CSS:
Это внутренний
ɵ
префикс hense , но в любом случае команда Angular использует его в своих пакетах именно так.источник
В моем случае я получил URL-адрес изображения, прежде чем перейти к компоненту отображения, и хочу использовать его в качестве фонового изображения, поэтому, чтобы использовать этот URL-адрес, я должен сообщить Angular, что он безопасен и может быть использован.
В файле .ts
В файле .html
источник