<İframe src = “…”> `güvenli olmayan değer` istisnasına neden olmadan nasıl ayarlanır?


164

Bir iframe srcöznitelik ayarı içeren bir öğretici üzerinde çalışıyorum :

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

Bu bir istisna atar:

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

Zaten [src]başarılı olmadan bağlamaları kullanmayı denedim .

Yanıtlar:


344

Güncelleme v8

Aşağıdaki yanıtlar işe yarar ancak uygulamanızı XSS ​​güvenlik risklerine maruz bırakır! . Kullanmak yerine, kullanılması this.sanitizer.bypassSecurityTrustResourceUrl(url)tavsiye edilirthis.sanitizer.sanitize(SecurityContext.URL, url)

Güncelleme

İçin RC.6 ^ versiyon kullanımı DomSanitizer

Plunker

Ve bunun için iyi bir seçenek saf boru kullanmaktır:

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

Yeni eklemeyi unutmayın SafePipeiçin declarationsAppModule dizisi. ( dokümantasyonda görüldüğü gibi )

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

html

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

Plunker

embedEtiketi kullanırsanız bu sizin için ilginç olabilir:


Eski sürüm RC.5

Bu şekilde yararlanabilirsiniz DomSanitizationService:

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

Ve sonra urlşablonunuza bağlanın :

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

Aşağıdaki içe aktarmaları eklemeyi unutmayın:

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

Piston örneği


1
@FugueWeb Çünkü ionic2 bugün açısal RC4 kullanıyor. github.com/driftyco/ionic/blob/master/…
yurzui

2
Ionic2 kullanıyorum. Bir boru ilan ediyorum Pipe({ name: 'safe' }) export class SafePipe implements PipeTransform { constructor(private sanitizer: DomSanitizer) {} transform(url): any { return this.sanitizer.bypassSecurityTrustResourceUrl(url); } } ve şablonda çağırıyorum <iframe width="100%" height="315" src="{{url}} | safe" frameborder="0" allowfullscreen></iframe>. Ancak 'güvensiz değer' hatasıyla çalışmaz. Lütfen yardım
Insane Rose

1
@Insane Rose sanırım sadece olmalı [src]="url | safe"parantez kaldırmak
yurzui

7
@yurzui Güncellenmiş v8 için önerinizi takip ettim. Ancak kullandığımda this.sanitizer.sanitize(SecurityContext.URL, url)bir hata alıyorum "HATA Hatası: bir kaynak URL bağlamında kullanılan güvensiz değer" II this.sanitizer.bypassSecurityTrustResourceUrl(url)iyi çalışır değiştirin . Neyin yanlış olabileceği hakkında bir fikrin var mı?
Kosmonaft

2
this.sanitizer.sanitize(SecurityContext.URL, url)çalışmıyor ve this.sanitizer.bypassSecurityTrustResourceUrl(url)çalışıyor ancak statik kod analizinde yüksek güvenlik açığı sorununu doğuruyor, bu da bunu üretime taşımamı engelliyor. Bunu düzeltmek için bir yol gerek
cjkumaresh

28

Bu benim için çalışıyor.

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

Bunu 1 yerde kullandığım için bu yaklaşım benim için çalışıyor. Aksi takdirde boru yaklaşımı daha iyidir.
Narek Tootikian

@Pang Nasıl çalışır? aynı sorunu var url benim parametre eklemek istiyorum bu kodu kullanıyorum "@Input () parametreForFB: sayı = this.selectedStudent.schoolId url: string =" designs.mydeievents.com/jq-3d-flip-book /index.html?id=$ {parametreForFB} "; urlSafe: SafeResourceUrl;" ancak parametrede çalışan yüz sorunu değil.
Arjun Walmiki

15

Bu beni Açısal 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>

tüm millet thats !!!


7
constructor(
 public sanitizer: DomSanitizer, ) {

 }

4 saattir mücadele ediyordum. sorun img etiketindeydi. 'Src' için köşeli ayraç kullandığınızda örnek: [src]. bu açısal ifadeyi {{}} kullanamazsınız. doğrudan aşağıdaki nesne örneğinden verirsiniz. {{}} açısal ifade verirseniz. enterpolasyon hatası alırsınız.

  1. önce ülkeleri tekrarlamak için

    *ngFor="let country of countries"
    
  2. İkincisi bunu img etiketine koyarsınız. budur.

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

İşlev çağrısını HTML içine yerleştirmenin kötü bir fikir olduğunu unutmayın, çünkü ChangeDetector'ın değişiklikleri her kontrol edişinde çağrılır.
karoluS

1

Bu sorunla da karşılaştım, ancak açısal modülümde güvenli bir boru kullanmak için, burada bulabileceğiniz güvenli boru npm paketini kurdum . FYI, bu Angular 9.1.3'te çalıştı, bunu Angular'ın diğer sürümlerinde denemedim. Adım adım nasıl ekleyeceğiniz aşağıda açıklanmıştır:

  1. Paketi npm kurulum emniyet borusu veya iplik ekleme emniyet borusu ile kurun. Bu, yeni bir Açısal proje başlatmanızdan önce sahip olmanız gereken paket.json dosyasındaki bağımlılıklarınızda ona bir başvuru depolar.

  2. Angular modül dosyanızdaki NgModule.imports'a SafePipeModule modülünü aşağıdaki gibi ekleyin:

    import { SafePipeModule } from 'safe-pipe';
    
    @NgModule({
        imports: [ SafePipeModule ]
    })
    export class AppModule { }
    
    
  3. NgModule'nize içe aktardığınız Açısal bileşen için şablondaki bir öğeye güvenli boruyu ekleyin:

<element [property]="value | safe: sanitizationType"></element>
  1. Bir html öğesinde safePipe'ın bazı spesifik örnekleri aşağıda verilmiştir:
<div [style.background-image]="'url(' + pictureUrl + ')' | safe: 'style'" class="pic bg-pic"></div>
<img [src]="pictureUrl | safe: 'url'" class="pic" alt="Logo">
<iframe [src]="catVideoEmbed | safe: 'resourceUrl'" width="640" height="390"></iframe>
<pre [innerHTML]="htmlContent | safe: 'html'"></pre>


-1

Genellikle aşağıdaki gibi ayrı güvenli boru yeniden kullanılabilir bileşeni eklerim

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

-8

Tebrikler! ¨ ^^ Sizin için kolay ve verimli bir çözümüm var, evet!

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

{{video.url}} yerine "video.url" yerine [attr.src]

Harika ;)


5
Bu dize değerleri için fark yaratmaz.
Günter Zöchbauer

1
çalışmıyor. Hata mesajı unsafe value used in a resource URL context
Derek Liang

Yani, html5 video etiketini kullanabilirsiniz, ancak iframe kullanmak için ısrar ederseniz (birçok nedenden dolayı;) DomSanitizationService kullanan diğer çözümlere bakın ..
Smaillns

yani 'video' etiketini arıyorsanız <video> <source [src]=video.url type="video/mp4" /> Browser not supported </video> , aslında böyle olacak , belgeleri de görüntülemek için de kullanabilirsiniz .. video etiketi kullanırken herhangi bir sorun yaşarsanız, ben buradayım;)
Smaillns
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.