DomSanitizer.sanitize(), SecurityContext.RESOURCE_URL ile ve açıkça güvenilir olarak işaretlenmemiş bir değerle çağrıldığında Angular, unsafe value used in a resource URL context mesajıyla bu hatayı fırlatır.
Kaynak URL'leri, sıradan URL'lerden farklı ele alınır. Angular düz bir URL'yi temizleyebilir, ancak keyfi bir kaynak URL'sini güvenli hale getiremez; çünkü <iframe src> veya <link href> gibi kaynak URL nitelikleri tarayıcının harici içeriği getirip çalıştırmasına neden olur. Bu nedenle sanitize(), güvenilmeyen değerleri temizlemeye çalışmak yerine reddeder.
Bu niteliklerden birine bir şablonda veya host binding'de güvenilmeyen bir değer bağlamak bunun yerine NG0904 hatasını fırlatır.
Hatayı ayıklama
SecurityContext.RESOURCE_URL kullanan bir sanitize() çağrısını arayın. Hata, statik görünen bir URL dahil olmak üzere her düz string için fırlatılır:
@Component({
selector: 'app-root',
template: `<iframe [src]="url"></iframe>`,
})
export class App {
private readonly sanitizer = inject(DomSanitizer);
url = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, 'https://example.com/embed'); // NG05201 fırlatır
}
URL güvenilir ve kontrollü bir kaynaktan geliyorsa, DomSanitizer.bypassSecurityTrustResourceUrl ile güvenli olarak işaretleyin ve sonucu doğrudan bağlayın:
import {DomSanitizer, SafeResourceUrl} from '@angular/platform-browser';
import {Component, inject} from '@angular/core';
@Component({
selector: 'app-root',
template: `<iframe [src]="safeUrl"></iframe>`,
})
export class App {
safeUrl: SafeResourceUrl = inject(DomSanitizer).bypassSecurityTrustResourceUrl(
'https://example.com/embed',
);
}
CRITICAL: bypassSecurityTrustResourceUrl bir temizleyici değil, bir kaçış kapısıdır. Kullanıcıdan gelen URL'leri asla buradan geçirmeyin; bu, bir saldırganın kötü amaçlı betikler dahil olmak üzere keyfi içerik yüklemesine izin verir. Yalnızca değer tamamen sizin kontrolünüzdeyken kullanın.
Daha fazla bilgi için Güvenlik rehberine bakın.