Angular lève cette erreur, avec le message unsafe value used in a resource URL context, lorsque DomSanitizer.sanitize() est appelé avec SecurityContext.RESOURCE_URL et une valeur qui n'a pas été explicitement marquée comme de confiance.
Les URL de ressource sont traitées différemment des URL classiques. Angular peut assainir une URL simple, mais ne peut pas rendre sûre une URL de ressource arbitraire, car les attributs d'URL de ressource, comme <iframe src> ou <link href>, amènent le navigateur à récupérer et exécuter du contenu externe. sanitize() rejette donc les valeurs non fiables au lieu d'essayer de les assainir.
Lier une valeur non fiable à l'un de ces attributs dans un template ou un host binding lève plutôt l'erreur NG0904.
Déboguer l'erreur
Cherchez un appel à sanitize() qui utilise SecurityContext.RESOURCE_URL. L'erreur est levée pour n'importe quelle chaîne simple, même une URL d'apparence statique :
@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'); // throws NG05201
}
Si l'URL provient d'une source contrôlée et de confiance, marquez-la comme sûre avec DomSanitizer.bypassSecurityTrustResourceUrl et liez directement le résultat :
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',
);
}
Critique : bypassSecurityTrustResourceUrl est une échappatoire, pas un mécanisme d'assainissement. Ne lui passez jamais d'URL fournies par l'utilisateur : cela permettrait à un attaquant de charger du contenu arbitraire, y compris des scripts malveillants. Ne l'utilisez que lorsque la valeur est entièrement sous votre contrôle.
Pour plus d'informations, consultez le guide de sécurité.