196 votes

Comment définir <iframe src="..."> sans provoquer d'exception `unsafe value` ?

Je travaille sur un tutoriel impliquant la mise en place d'une iframe src attribut :

<iframe width="100%" height="300" src="{{video.url}}"></iframe>

Une exception est alors levée :

Error: unsafe value used in a resource URL context
at DomSanitizationServiceImpl.sanitize...

J'ai déjà essayé d'utiliser des liaisons avec [src] sans succès.

402voto

yurzui Points 85802

Mise à jour v8

Les réponses ci-dessous fonctionnent mais expose votre application à des risques de sécurité XSS ! . Au lieu d'utiliser this.sanitizer.bypassSecurityTrustResourceUrl(url) il est recommandé d'utiliser this.sanitizer.sanitize(SecurityContext.URL, url)

Mise à jour

Para RC.6^ utilisation de la version DomSanitizer

Plunker

Et une bonne option consiste à utiliser un tuyau pur pour cela :

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer} from '@angular/platform-browser';

@Pipe({ name: 'safe' })
export class SafePipe implements PipeTransform {
  constructor(private sanitizer: DomSanitizer) {}
  transform(url) {
    return this.sanitizer.bypassSecurityTrustResourceUrl(url);
  }
} 

n'oubliez pas d'ajouter votre nouvelle SafePipe à la declarations de l'AppModule. ( comme vu dans la documentation )

@NgModule({
   declarations : [
     ...
     SafePipe
   ],
})

html

<iframe width="100%" height="300" [src]="url | safe"></iframe>

Plunker

Si vous utilisez embed tag ceci pourrait être intéressant pour vous :


Ancienne version RC.5

Vous pouvez tirer parti DomSanitizationService comme ça :

export class YourComponent {
  url: SafeResourceUrl;
  constructor(sanitizer: DomSanitizationService) {
    this.url = sanitizer.bypassSecurityTrustResourceUrl('your url');
  }
}

Et ensuite lier à url dans votre modèle :

<iframe width="100%" height="300" [src]="url"></iframe>

N'oubliez pas d'ajouter les importations suivantes :

import { SafeResourceUrl, DomSanitizationService } from '@angular/platform-browser';

Echantillon Plunker

0 votes

L'ancienne version a fonctionné pour moi à partir d'aujourd'hui, je ne suis pas sûr de ce à quoi 'ancien' fait référence car j'utilise Ionic 2 et DomSanitizer n'était même pas reconnu (alors que DomSanitizationService l'était). Merci !

1 votes

@FugueWeb C'est parce que ionic2 utilise angular RC4 aujourd'hui. github.com/driftyco/ionic/blob/master/

2 votes

J'utilise Ionic2. Je déclare un tuyau Pipe({ name: 'safe' }) export class SafePipe implements PipeTransform { constructor(private sanitizer: DomSanitizer) {} transform(url): any { return this.sanitizer.bypassSecurityTrustResourceUrl(url); } } et dans le modèle que j'appelle <iframe width="100%" height="315" src="{{url}} | safe" frameborder="0" allowfullscreen></iframe> . Mais cela ne fonctionne pas avec l'erreur 'unsafe value'. Veuillez m'aider.

39voto

vikvincer Points 275

Celui-là marche pour moi.

import { Component,Input,OnInit} from '@angular/core';
import {DomSanitizer,SafeResourceUrl,} from '@angular/platform-browser';

@Component({
    moduleId: module.id,
    selector: 'player',
    templateUrl: './player.component.html',
    styleUrls:['./player.component.scss'],

})
export class PlayerComponent implements OnInit{
    @Input()
    id:string; 
    url: SafeResourceUrl;
    constructor (public sanitizer:DomSanitizer) {
    }
    ngOnInit() {
        this.url = this.sanitizer.bypassSecurityTrustResourceUrl(this.id);      
    }
}

0 votes

Cette approche me convient puisque je l'utilise à un seul endroit. Sinon, l'approche par les tuyaux est meilleure.

0 votes

@Pang Comment cela fonctionne-t-il ? j'ai le même problème, je veux ajouter mon paramètre dans l'url, j'utilise ce code "@Input() parameterForFB : number = this.selectedStudent.schoolId url : string = " designs.mydeievents.com/jq-3d-flip-book/index.html?id=$ {parameterForFB}" ; urlSafe : SafeResourceUrrl ;" mais cela ne fonctionne pas, car il y a un problème avec le paramètre.

0 votes

Merci. C'est le seul moyen que j'ai trouvé pour que cela fonctionne, aucun des exemples avec pipe ne fonctionnait.

21voto

Lrodriguez84 Points 149

Cela me fait passer à Angular 5.2.0

sarasa.Component.ts

import { Component, OnInit, Input } from '@angular/core';
import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';

@Component({
  selector: 'app-sarasa',
  templateUrl: './sarasa.component.html',
  styleUrls: ['./sarasa.component.scss']
})

export class Sarasa implements OnInit {
  @Input()
  url: string = "https://www.mmlpqtpkasjdashdjahd.com";
  urlSafe: SafeResourceUrl;

  constructor(public sanitizer: DomSanitizer) { }

  ngOnInit() {
    this.urlSafe= this.sanitizer.bypassSecurityTrustResourceUrl(this.url);
  }

}

sarasa.Component.html

<iframe width="100%" height="100%" frameBorder="0" [src]="urlSafe"></iframe>

c'est tout les gens !!!

0 votes

J'ai essayé ceci. Cela fonctionne mais la console continue d'afficher l'erreur Error : unsafe value used in a resource URL context.

7voto

Kumaresan Perumal Points 1035
constructor(
 public sanitizer: DomSanitizer, ) {

 }

J'ai lutté pendant 4 heures. Le problème était dans la balise img. Lorsque vous utilisez le crochet pour 'src' ex : [src]. vous ne pouvez pas utiliser cette expression angulaire {{}}. vous devez juste donner directement à partir d'un objet exemple ci-dessous. si vous donnez l'expression angulaire {{}}. vous aurez une erreur d'interpolation.

  1. d'abord j'ai utilisé ngFor pour itérer les pays

    *ngFor="let country of countries"
  2. Ensuite, tu mets ça dans la balise img. C'est ça.

    <img [src]="sanitizer.bypassSecurityTrustResourceUrl(country.flag)"
    height="20" width="20" alt=""/>

1 votes

Sachez que mettre l'appel de fonction à l'intérieur du HTML est une mauvaise idée car il sera appelé à chaque fois que ChangeDetector vérifiera les changements.

-1voto

Janki Points 1

J'ajoute généralement un composant réutilisable séparé de type "safe pipe" comme suit

# Add Safe Pipe

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Pipe({name: 'mySafe'})
export class SafePipe implements PipeTransform {
    constructor(private sanitizer: DomSanitizer) {
    }

    public transform(url) {
        return this.sanitizer.bypassSecurityTrustResourceUrl(url);
    }
}

# then create shared pipe module as following 

import { NgModule } from '@angular/core'; 
import { SafePipe } from './safe.pipe';
@NgModule({
    declarations: [
        SafePipe
    ],
    exports: [
        SafePipe
    ]
})
export class SharedPipesModule {
}

# import shared pipe module in your native module

@NgModule({
    declarations: [],
    imports: [
        SharedPipesModule,
    ],
})
export class SupportModule {
}

<!-------------------
call your url (`trustedUrl` for me) and add `mySafe` as defined in Safe Pipe
---------------->
<div class="container-fluid" *ngIf="trustedUrl">
    <iframe [src]="trustedUrl | mySafe" align="middle" width="100%" height="800" frameborder="0"></iframe>
</div>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X