Carlos Cifuentes
Referencia AngularJS → Angular

ng-bind-html / $sce en Angular moderno

ng-bind-html pasa a ser un binding a [innerHTML], que sanitiza el contenido por defecto. $sce pasa a ser DomSanitizer, que se usa solo cuando necesitas saltarte esa sanitización.

Antes · AngularJS
// controller
vm.body = $sce.trustAsHtml(article.bodyHtml);
vm.videoUrl = $sce.trustAsResourceUrl(article.videoUrl);

<!-- template -->
<div ng-bind-html="vm.body"></div>
<iframe ng-src="{{ vm.videoUrl }}"></iframe>
Después · Angular
private sanitizer = inject(DomSanitizer);
article = input.required<Article>();

videoUrl = computed(() =>
  this.sanitizer.bypassSecurityTrustResourceUrl(this.article().videoUrl));

<!-- template -->
<div [innerHTML]="article().bodyHtml"></div>
<iframe [src]="videoUrl()"></iframe>

Qué cambia

  • [innerHTML] elimina scripts y atributos de eventos por su cuenta; no hay un módulo ngSanitize que instalar.
  • $sce.trustAsHtml pasa a ser bypassSecurityTrustHtml, para contenido que controlas por completo.
  • Las URL de iframes y elementos similares necesitan bypassSecurityTrustResourceUrl, igual que antes con trustAsResourceUrl.

Consejo de migración. Lista todas las llamadas a trustAs durante el diagnóstico, porque cada una es una decisión de seguridad que alguien tomó hace años. Muchas llamadas a trustAsHtml se pueden eliminar, ya que la sanitización por defecto alcanza para texto con formato.

Relacionado

¿Planeas una migración o una plataforma de microfrontends?

En una llamada de 20 minutos me cuentas tu situación y te digo cómo la abordaría. Si todavía no vale la pena, también te lo digo.

Escríbeme por LinkedIn