回答:
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);
}
}
新しいものSafePipe
をdeclarations
AppModuleの配列に追加することを忘れないでください。(ドキュメントで見られるように)
@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';
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>
。ただし、「安全でない値」のエラーでは機能しません。助けてください
[src]="url | safe"
ブラケットを削除する必要があると思います
this.sanitizer.sanitize(SecurityContext.URL, url)
と、「ERROR Error:unsafe value used in a resource URL context」IIのエラーが発生し、this.sanitizer.bypassSecurityTrustResourceUrl(url)
正常に機能するように変更します。何が間違っている可能性がありますか?
this.sanitizer.sanitize(SecurityContext.URL, url)
動作しませんが動作しthis.sanitizer.bypassSecurityTrustResourceUrl(url)
ますが、静的コード分析でセキュリティ上の脆弱性の問題が発生し、これにより本番環境に移行できなくなります。これを修正する方法が必要
これは私のために働きます。
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);
}
}
これは私に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>
それはみんな!
constructor(
public sanitizer: DomSanitizer, ) {
}
私は4時間も苦労していました。問題はimgタグにありました。角括弧を「src」に使用する例:[src]。この角度式{{}}は使用できません。以下のオブジェクトの例から直接与えるだけです。角度式{{}}を指定した場合。補間エラーが発生します。
最初にngForを使用して国を反復しました
*ngFor="let country of countries"
次に、これをimgタグに挿入します。これだよ。
<img [src]="sanitizer.bypassSecurityTrustResourceUrl(country.flag)"
height="20" width="20" alt=""/>
私もこの問題に遭遇しましたが、角度モジュールで安全なパイプを使用するために、ここにあるsafe-pipe npmパッケージをインストールしました。ちなみに、これはAngular 9.1.3で機能しましたが、Angularの他のバージョンではこれを試していません。これを段階的に追加する方法は次のとおりです。
npm install safe-pipeまたはyarn add safe-pipeを使用してパッケージをインストールします。これにより、依存関係のpackage.jsonファイルへの参照が保存されます。これは、新しいAngularプロジェクトを開始するときにすでに持っているはずです。
次のように、AngularモジュールファイルのNgModule.importsにSafePipeModuleモジュールを追加します。
import { SafePipeModule } from 'safe-pipe';
@NgModule({
imports: [ SafePipeModule ]
})
export class AppModule { }
次の方法で、NgModuleにインポートするAngularコンポーネントのテンプレートの要素にセーフパイプを追加します。
<element [property]="value | safe: sanitizationType"></element>
<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>
私は通常、次のように別の安全なパイプ再利用可能なコンポーネントを追加します
# 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>
おめでとうございます!¨^^簡単で効率的な解決策があります。
<iframe width="100%" height="300" [attr.src]="video.url"></iframe
[attr.src]ではなく、{{video.url}}ではなくsrc "video.url"
すごい ;)
unsafe value used in a resource URL context
<video> <source [src]=video.url type="video/mp4" /> Browser not supported </video>
、実際には次のようになります。ドキュメントを表示するためにも使用できます.. videoタグの使用時に問題が発生した場合は、ここにいます;)