AngularJS, uzantı sayfasında URL'leri "güvenli değil:" olarak değiştirir


186

Angular'ı bir uygulama listesiyle kullanmaya çalışıyorum ve her biri bir uygulamayı daha ayrıntılı olarak görmek için bir bağlantı ( apps/app.id):

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

Bu bağlantılardan birini her tıkladığımda Chrome URL'yi şu şekilde gösterir:

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

Nereden unsafe:geliyor?


1
ng-hrefSadece bu durumda kullanmanız gerektiğini unutmayın href: docs.angularjs.org/api/ng/directive/ngHref
hartz89

Sadece bir kontrolör yöntemi kullanıyorumfunction gotoURL(url) { $window.location.href = url; }
Todd Hale

Yanıtlar:


362

Normal bir ifade kullanarak Angular'ın beyaz listesine URL protokollerini açıkça eklemeniz gerekir. Sadece http, https, ftpve mailtovarsayılan olarak etkindir. Açısal, unsafe:gibi bir protokol kullanılırken beyaz listeye eklenmemiş bir URL'nin önüne ön ek ekler chrome-extension:.

chrome-extension:Protokolü beyaz listeye eklemek için iyi bir yer modülünüzün yapılandırma bloğunda olacaktır:

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

Aynı prosedür, file:ve gibi protokolleri kullanmanız gerektiğinde de geçerlidir tel:.

Daha fazla bilgi için lütfen AngularJS $ compileProvider API belgelerine bakın.


11
Açısal 1.2'de yöntem adı$compileProvider.aHrefSanitizationWhitelist
Mart

6
Varsayılan imgSrcSanitizationWhitelist Açısal 1.2-rc2, /^\s*(https?|ftp|file):|data:image\//yerel dosya sistemine erişmek için paketlenmiş bir uygulamanın |filesystem:chrome-extension:düzenli ifadesinin sonuna eklenmelidir.
Henning

29
Açısal 1.2'de aslında iki yöntem olduğunu unutmayın - Biri bağlantılar için (aHrefSanitizationWhitelist) ve diğeri görüntüler için (imgSrcSanitizationWhitelist). Bu beni bir süre şaşırttı.
mdierker

1
Bir Chrome Paket Uygulaması |blob:chrome-extension:için sonuna eklemeniz gerekir .
adam8810 31:14

1
Dosya protokolünün blob protokolünden farklı $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|file|blob|ftp|mailto|chrome-extension):/);
olduğuna dikkat edin

56

Herhangi birinin resimlerde de bu sorunu olması durumunda:

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

Ben html2canvas ile yakaladığım görüntü ekran görüntüleri listeleme beyaz için düzenli ifadeyi kullanarak denedim, şimdi güvensiz diyor bir hata yok: veri; ancak görüntü yakalanmıyor. Hangi düzenli ifadeyi kullanacağım hakkında bir fikrin var mı? Base64 URL'si olarak bir resim / png çekiyorum. Şimdi html şöyle görünüyor: <img ng-src = "data :," class = "img-
Responsive

6

Sadece posta, tel ve sms için ihtiyacınız varsa bunu kullanın:

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

2

Google Chrome, uzantılarının işbirliği yapmasını gerektirir Content Security Policy (CSP).

Öğesinin gereksinimlerini karşılamak için uzantınızı değiştirmeniz gerekir CSP.

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

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

Ayrıca, angularJS'nin ngCspkullanmanız gereken yönergesi vardır.

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


Zaten bu sayfa için ngCsp yönergesine sahibim '<html ng-app = "myApp" ng-csp>'. Bu benim manifest'ten CSP: Manifest'teki "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", csp'yi değiştirmem gerekiyor mu?
ebi

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

İçin 's yöntemini Angular 2+kullanabilirsiniz .DomSanitizerbypassSecurityTrustResourceUrl

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

class ExampleComponent {
    sanitizedURL : SafeResourceUrl;

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

Merhaba, Bunun için daha ayrıntılı bir örnek verebilir misiniz?
Jayesh Choudhary

Merhaba @JayeshChoudhary, Lütfen özellikle ne aradığınızı bana bildirir misiniz ve size daha iyi yardımcı olabilirim.
Raman
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.