AngularJSは拡張ページでURLを「安全でない」に変更します


186

アプリのリストでAngularを使用しようとしていますが、それぞれがアプリを詳細に表示するためのリンクです(apps/app.id):

<a id="{{app.id}}" href="apps/{{app.id}}" >{{app.name}}</a>

これらのリンクの1つをクリックするたびに、ChromeはURLを次のように表示します

unsafe:chrome-extension://kpbipnfncdpgejhmdneaagc.../apps/app.id

どこunsafe:から来たのですか?


1
あなたが使用する必要があることを覚えておいてくださいng-hrefというだけよりも、この場合にはhrefdocs.angularjs.org/api/ng/directive/ngHref
hartz89

私はコントローラーメソッドを使用していますfunction gotoURL(url) { $window.location.href = url; }
Todd Hale

回答:


362

正規表現を使用して、AngularのホワイトリストにURLプロトコルを明示的に追加する必要があります。のみhttphttpsftpおよびmailtoデフォルトで有効になっています。Angularは、ホワイトリストに登録されていないURLの前に、unsafe:などのプロトコルを使用するときにプレフィックスを付けますchrome-extension:

chrome-extension:プロトコルをホワイトリストに登録するのに適した場所は、モジュールの構成ブロックになります。

var app = angular.module( 'myApp', [] )
.config( [
    '$compileProvider',
    function( $compileProvider )
    {   
        $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|chrome-extension):/);
        // Angular before v1.2 uses $compileProvider.urlSanitizationWhitelist(...)
    }
]);

file:およびなどのプロトコルを使用する必要がある場合にも、同じ手順が適用されますtel:

詳細については、AngularJS $ compileProvider APIドキュメントをご覧ください。


11
Angular 1.2では、メソッド名は次のようになりました$compileProvider.aHrefSanitizationWhitelist
Mart

6
デフォルトのimgSrcSanitizationWhitelist Angular 1.2-rc2は/^\s*(https?|ftp|file):|data:image\//、ローカルパッケージファイルシステムにアクセスするために、クロムパッケージ化されたアプリ|filesystem:chrome-extension:を正規表現の最後に追加する必要があります。
Henning

29
Angular 1.2では、実際には2つのメソッドがあることに注意してください-リンク用(aHrefSanitizationWhitelist)と画像用(imgSrcSanitizationWhitelist)です。これは私をしばらく固執させました。
mdierker 2013

1
Chromeパッケージアプリの場合は|blob:chrome-extension:、最後に追加する必要があります。
adam8810 14年

1
ファイルプロトコルは、ブロブプロトコルとは異なることに注意してください: $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|file|blob|ftp|mailto|chrome-extension):/);
アルノーLeyder

56

画像にこの問題がある場合も同様に:

app.config(['$compileProvider', function ($compileProvider) {
    $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);
}]);

正規表現を使用して、html2canvasでキャプチャしている画像のスクリーンショットをホワイトリストにしてみましたが、今はunsafe:dataと言うエラーはありません。しかし、画像はキャプチャされていません。どの正規表現を使用するか考えていますか?image / pngをbase64 url​​としてキャプチャしています。これで、htmlは次のようになります。<img ng-src = "data :," class = "img-sensitive" src = "data:、">実際のbase64 URLではなく
hakuna

6

メール、tel、smsが必要な場合は、次のようにします。

app.config(['$compileProvider', function ($compileProvider) {
    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|sms|tel):/);
}]);

2

Google Chromeでは、拡張機能との連携が必要です Content Security Policy (CSP)ます。

の要件を満たすように拡張機能を変更する必要がありますCSP

https://developer.chrome.com/extensions/contentSecurityPolicy.html

https://developer.mozilla.org/en-US/docs/Security/CSP

また、angularJSにはngCsp、使用する必要があるディレクティブがあります。

http://docs.angularjs.org/api/ng.directive:ngCsp


そのページのngCspディレクティブ '<html ng-app = "myApp" ng-csp>'はすでにあります。これは私のマニフェストのCSP "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", です。マニフェストのcspを変更する必要がありますか?
ebi 2013年

2
<a href="{{applicant.resume}}" download> download resume</a>


var app = angular.module("myApp", []);

    app.config(['$compileProvider', function($compileProvider) {
         $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);
        $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);

        }]);

2

以下のためにAngular 2+あなたが使用することができますDomSanitizerbypassSecurityTrustResourceUrl方法を。

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

class ExampleComponent {
    sanitizedURL : SafeResourceUrl;

    constructor(
        private sanitizer: DomSanitizer){
        this.sanitizedURL = this.sanitizer.bypassSecurityTrustResourceUrl(); 
    }
}

こんにちは、同じことについてより複雑な例を提供できますか。
Jayesh Choudhary

こんにちは@JayeshChoudhary、あなたが具体的に探しているものを教えてください。私はあなたをよりよく助けることができるかもしれません。
Raman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.