「安全でない値」例外を発生させずに<iframe src =“…”>を設定する方法


164

私はiframe src属性の設定を含むチュートリアルに取り組んでいます:

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

これは例外をスローします:

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

私はすでにバインディングを使用してみました[src]が、成功しませんでした。

回答:


343

v8を更新

以下の回答は機能します、アプリケーションをXSSセキュリティリスクにさらします。。を使用する代わりに、使用this.sanitizer.bypassSecurityTrustResourceUrl(url)することをお勧めしますthis.sanitizer.sanitize(SecurityContext.URL, url)

更新

RC.6 ^バージョンの使用DomSanitizer

プランカー

そして、良いオプションはそのために純粋なパイプを使うことです:

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

新しいものSafePipedeclarationsAppModuleの配列に追加することを忘れないでください。(ドキュメントで見られるように

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

html

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

プランカー

embedタグを使用する場合、これはあなたにとって興味深いかもしれません:


旧バージョンRC.5

DomSanitizationServiceこのように活用できます:

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

次にurl、テンプレートにバインドします。

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

次のインポートを追加することを忘れないでください:

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

プランカーサンプル


1
@FugueWebこれは、ionic2が今日、角度付きRC4を使用しているためです。github.com/driftyco/ionic/blob/master/...
yurzui

2
Ionic2を使用しています。パイプを宣言し、Pipe({ name: 'safe' }) export class SafePipe implements PipeTransform { constructor(private sanitizer: DomSanitizer) {} transform(url): any { return this.sanitizer.bypassSecurityTrustResourceUrl(url); } } テンプレートで呼び出します<iframe width="100%" height="315" src="{{url}} | safe" frameborder="0" allowfullscreen></iframe>。ただし、「安全でない値」のエラーでは機能しません。助けてください
インセインローズ

1
@Insane Rose私はそれは[src]="url | safe"ブラケットを削除する必要があると思います
yurzui

7
@yurzui更新されたv8の推奨に従いました。しかし、使用するthis.sanitizer.sanitize(SecurityContext.URL, url)と、「ERROR Error:unsafe value used in a resource URL context」IIのエラーが発生し、this.sanitizer.bypassSecurityTrustResourceUrl(url)正常に機能するように変更します。何が間違っている可能性がありますか?
Kosmonaft

2
this.sanitizer.sanitize(SecurityContext.URL, url)動作しませんが動作しthis.sanitizer.bypassSecurityTrustResourceUrl(url)ますが、静的コード分析でセキュリティ上の脆弱性の問題が発生し、これにより本番環境に移行できなくなります。これを修正する方法が必要
cjkumaresh '16 / 10/16

28

これは私のために働きます。

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

私はこれを1か所で使用するので、このアプローチは私にとってはうまくいきます。それ以外の場合は、パイプアプローチの方が適しています。
Narek Tootikian

@Pangどのように機能しますか?私はこれらのコードを使用していたURLに私のパラメータを追加したい、同じ問題「:数= this.selectedStudent.schoolId URL文字列= @Inputを()parameterForFB」持っているdesigns.mydeievents.com/jq-3d-flip-bookを/index.html?id=$ {parameterForFB} "; urlSafe:SafeResourceUrl;" しかし、機能していないパラメータの問題に直面しています。
Arjun Walmiki

15

これは私に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>

それはみんな!


7
constructor(
 public sanitizer: DomSanitizer, ) {

 }

私は4時間も苦労していました。問題はimgタグにありました。角括弧を「src」に使用する例:[src]。この角度式{{}}は使用できません。以下のオブジェクトの例から直接与えるだけです。角度式{{}}を指定した場合。補間エラーが発生します。

  1. 最初にngForを使用して国を反復しました

    *ngFor="let country of countries"
    
  2. 次に、これをimgタグに挿入します。これだよ。

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

ChangeDetectorが変更をチェックするたびに呼び出されるため、HTML内に関数呼び出しを配置することはお勧めできません。
karoluS

1

私もこの問題に遭遇しましたが、角度モジュールで安全なパイプを使用するために、ここにあるsafe-pipe npmパッケージをインストールしました。ちなみに、これはAngular 9.1.3で機能しましたが、Angularの他のバージョンではこれを試していません。これを段階的に追加する方法は次のとおりです。

  1. npm install safe-pipeまたはyarn add safe-pipeを使用してパッケージをインストールします。これにより、依存関係のpackage.jsonファイルへの参照が保存されます。これは、新しいAngularプロジェクトを開始するときにすでに持っているはずです。

  2. 次のように、AngularモジュールファイルのNgModule.importsにSafePipeModuleモジュールを追加します。

    import { SafePipeModule } from 'safe-pipe';
    
    @NgModule({
        imports: [ SafePipeModule ]
    })
    export class AppModule { }
    
    
  3. 次の方法で、NgModuleにインポートするAngularコンポーネントのテンプレートの要素にセーフパイプを追加します。

<element [property]="value | safe: sanitizationType"></element>
  1. 次に、html要素内のsafePipeの具体例をいくつか示します。
<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

私は通常、次のように別の安全なパイプ再利用可能なコンポーネントを追加します

# 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

おめでとうございます!¨^^簡単で効率的な解決策があります。

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

[attr.src]ではなく、{{video.url}}ではなくsrc "video.url"

すごい ;)


5
これは、文字列値に違いはありません。
ギュンターZöchbauer

1
動作しません。エラーメッセージの取得unsafe value used in a resource URL context
Derek Liang

だから、あなたは、HTML5のvideoタグを使用しますが、あなたは(多くの理由;)はiframeを使用するように主張すればできるDomSanitizationService ..使用し、他のソリューションを参照
Smaillns

したがって、「video」タグの使用を探している場合は <video> <source [src]=video.url type="video/mp4" /> Browser not supported </video> 、実際には次のようになります。ドキュメントを表示するためにも使用できます.. videoタグの使用時に問題が発生した場合は、ここにいます;)
Smaillns
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.