<img>: valore non sicuro utilizzato nel contesto dell'URL di una risorsa


109

Dall'aggiornamento all'ultima release candidate di Angular 2, i miei imgtag:

<img class='photo-img' [hidden]="!showPhoto1" src='{{theMediaItem.photoURL1}}'>

stanno generando un errore del browser:

ECCEZIONE ORIGINALE: Errore: valore non sicuro utilizzato nel contesto dell'URL di una risorsa

Il valore dell'URL è:

http://veeu-images.s3.amazonaws.com/media/userphotos/116_1464645173408_cdv_photo_007.jpg

MODIFICARE:

Ho provato il suggerimento fatto nell'altra soluzione di cui si suppone che questa domanda sia un duplicato, ma ricevo lo stesso errore.

Ho aggiunto il seguente codice al controller:

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

@Component({
  templateUrl: 'build/pages/veeu/veeu.html'
})
export class VeeUPage {
  static get parameters() {
    return [[NavController], [App], [MenuController], [DomSanitizationService]];
  }

  constructor(nav, app, menu, sanitizer) {

    this.app = app;
    this.nav = nav;
    this.menu = menu;
    this.sanitizer = sanitizer;

    this.theMediaItem.photoURL1 = this.sanitizer.bypassSecurityTrustUrl(this.mediaItems[1].url);
  }

Continuo a ricevere lo stesso messaggio di errore.

EDIT2:

Ho anche cambiato l'html in:

<img class='photo-img' [hidden]="!showPhoto1" [src]='theMediaItem.photoURL1'>

Continuo a ricevere lo stesso messaggio di errore


Non mi è chiaro cosa dovrei cambiare. Devo cambiare src = "{{something.else}}" in [src] = "something.else"?
Bill Noble

1
Esattamente:[src]='theMediaItem.photoURL1'
Günter Zöchbauer

Sì, l'ho provato e ricevo lo stesso messaggio di errore.
Bill Noble,

Quale versione di Angular2 stai usando?
Günter Zöchbauer

Penso di utilizzare 2.0.0-beta.15 (sto usando ionico e non sono del tutto sicuro di come controllare). Mi scuso per il modo in cui ho aggiunto il codice Non sono chiaro sul protocollo.
Bill Noble

Risposte:


95

Sto usando rc.4 e questo metodo funziona per ES2015 (ES6):

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

@Component({
  templateUrl: 'build/pages/veeu/veeu.html'
})
export class VeeUPage {
  static get parameters() {
    return [NavController, App, MenuController, DomSanitizationService];
  }

  constructor(nav, app, menu, sanitizer) {

    this.app = app;
    this.nav = nav;
    this.menu = menu;
    this.sanitizer = sanitizer;    
  }

  photoURL() {
    return this.sanitizer.bypassSecurityTrustUrl(this.mediaItems[1].url);
  }
}

Nell'HTML:

<iframe [src]='photoURL()' width="640" height="360" frameborder="0"
    webkitallowfullscreen mozallowfullscreen allowfullscreen>
</iframe>

L'uso di una funzione assicurerà che il valore non cambi dopo averlo disinfettato. Tieni inoltre presente che la funzione di sanificazione che utilizzi dipende dal contesto.

Per le immagini, bypassSecurityTrustUrlfunzionerà ma per altri usi è necessario fare riferimento alla documentazione :

https://angular.io/docs/ts/latest/api/platform-browser/index/DomSanitizer-class.html


3
Cos'è "rc4" (e successivamente Helzgate si riferisce a RC3 )? Voglio dire, come lo associo a una versione di GitHub? Sia in github che in npm vedo solo versioni come 2.4.4 o 2.4.5. Sono attualmente sulla 2.4.4 e sembra che DomSanitizer sia cambiato; quindi questa è l'importazione di cui hai bisogno:import {DomSanitizer} from '@angular/platform-browser';
The Red Pea

Oh, penso che i rami github di angular si riferiscano ad 2.4.xesempio, ma i tag github si riferiranno a candidati di rilascio, come 2.0.0-rc3. E posso vedere in rc3 , ad esempio, la classe era ancora nominata DomSanitizationService.
The Red Pea

1
this.sanitizer.bypassSecurityTrustResourceUrl(url)per i video
Prayagupd

Leggere attentamente la documentazione prima di utilizzare questo: bypassSecurityTrustUrl () ATTENZIONE: chiamare questo metodo con dati utente non attendibili espone l'applicazione a rischi per la sicurezza XSS! Mi sembra che non sia sicuro farlo, a meno che tu non sia veramente sicuro che la fonte dell'immagine sia attendibile. Anche se proviene da un server, se fosse caricato da un utente sarebbe possibile sfruttare tale soluzione.
Wilt

144

Tubo

// Angular
import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer, SafeHtml, SafeStyle, SafeScript, SafeUrl, SafeResourceUrl } from '@angular/platform-browser';

/**
 * Sanitize HTML
 */
@Pipe({
  name: 'safe'
})
export class SafePipe implements PipeTransform {
  /**
   * Pipe Constructor
   *
   * @param _sanitizer: DomSanitezer
   */
  // tslint:disable-next-line
  constructor(protected _sanitizer: DomSanitizer) {
  }

  /**
   * Transform
   *
   * @param value: string
   * @param type: string
   */
  transform(value: string, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {
    switch (type) {
      case 'html':
        return this._sanitizer.bypassSecurityTrustHtml(value);
      case 'style':
        return this._sanitizer.bypassSecurityTrustStyle(value);
      case 'script':
        return this._sanitizer.bypassSecurityTrustScript(value);
      case 'url':
        return this._sanitizer.bypassSecurityTrustUrl(value);
      case 'resourceUrl':
        return this._sanitizer.bypassSecurityTrustResourceUrl(value);
      default:
        return this._sanitizer.bypassSecurityTrustHtml(value);
    }
  }
}

Modello

{{ data.url | safe:'url' }}

Questo è tutto!

Nota: non dovresti averne bisogno, ma ecco l'uso dei componenti del tubo
  // Public properties
  itsSafe: SafeHtml;

  // Private properties
  private safePipe: SafePipe = new SafePipe(this.domSanitizer);

  /**
   * Component constructor
   *
   * @param safePipe: SafeHtml
   * @param domSanitizer: DomSanitizer
   */
  constructor(private safePipe: SafePipe, private domSanitizer: DomSanitizer) {
  }

  /**
   * On init
   */
  ngOnInit(): void {
    this.itsSafe = this.safePipe.transform('<h1>Hi</h1>', 'html');
  }


24

Usa Safe Pipe per ripararlo.

  • Crea una pipa sicura se non ne hai.

    ng gc pipe safe

  • aggiungi Safe pipe in app.module.ts

    dichiarazioni: [SafePipe]

  • dichiarare pipa sicura nel tuo ts

Importa Dom Sanitizer e Safe Pipe per accedere all'URL in modo sicuro

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);
  }
}

- Aggiungi cassaforte con URL SRC

<iframe width="900" height="500" [src]="link | safe"/>

2
Grande! Una cosa, non dovrebbe essere "ng g pipe safe" invece di "ng gc pipe safe", cosa ovviamente non funzionerà?
Jacob-Jan Mosselman,

15

Puoi esporre disinfettante alla vista o esporre un metodo che inoltra la chiamata a bypassSecurityTrustUrl

<img class='photo-img' [hidden]="!showPhoto1" 
    [src]='sanitizer.bypassSecurityTrustUrl(theMediaItem.photoURL1)'>

2

Angular considera tutti i valori come non attendibili per impostazione predefinita. Quando un valore viene inserito nel DOM da un modello, tramite proprietà, attributo, stile, associazione di classe o interpolazione, Angular disinfetta ed evita i valori non attendibili.

Quindi, se stai manipolando DOM direttamente e inserendo del contenuto, devi disinfettarlo altrimenti Angular lo farà per errori.

Ho creato il tubo SanitizeUrlPipe per questo

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

@Pipe({
    name: "sanitizeUrl"
})
export class SanitizeUrlPipe implements PipeTransform {

    constructor(private _sanitizer: DomSanitizer) { }

    transform(v: string): SafeHtml {
        return this._sanitizer.bypassSecurityTrustResourceUrl(v);
    }
}

ed è così che puoi usare

<iframe [src]="url | sanitizeUrl" width="100%" height="500px"></iframe>

Se vuoi aggiungere HTML, SanitizeHtmlPipe può aiutarti

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

@Pipe({
    name: "sanitizeHtml"
})
export class SanitizeHtmlPipe implements PipeTransform {

    constructor(private _sanitizer: DomSanitizer) { }

    transform(v: string): SafeHtml {
        return this._sanitizer.bypassSecurityTrustHtml(v);
    }
}

Maggiori informazioni sulla sicurezza angolare qui .


1

Di solito aggiungo un safe pipecomponente riutilizzabile separato come segue

# 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>

0
import {DomSanitizationService} from '@angular/platform-browser';
@Component({
 templateUrl: 'build/pages/veeu/veeu.html'
 })
  export class VeeUPage {
     trustedURL:any;
      static get parameters() {
               return [NavController, App, MenuController, 
              DomSanitizationService];
        }
      constructor(nav, app, menu, sanitizer) {
        this.app = app;
        this.nav = nav;
        this.menu = menu;
        this.sanitizer = sanitizer;  
        this.trustedURL  = sanitizer.bypassSecurityTrustUrl(this.mediaItems[1].url);
        } 
 }



 <iframe [src]='trustedURL' width="640" height="360" frameborder="0"
   webkitallowfullscreen mozallowfullscreen allowfullscreen>
</iframe>


User property binding instead of function.

0

È possibile impostare un'immagine come immagine di sfondo per evitare unsafe urlerrori:

<div [style.backgroundImage]="'url(' + imageUrl + ')'" class="show-image"></div>

CSS:

.show-image {
    width: 100px;
    height: 100px;
    border-radius: 50%;
    background-size: cover;        
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.