2013-03-25 8 views
156

Ich versuche, mit einer Liste von Anwendungen Eckige zu verwenden, und jeder ist ein Link auf eine App im Detail (apps/app.id) zu sehen:Winkeländerungen URLs zu „unsicher“ in Verlängerung Seite

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

Jedes Mal, wenn ich auf einen dieser Links klicke, zeigt Chrome die URL als unsafe:chrome-extension://kpbipnfncdpgejhmdneaagc.../apps/app.id

Woher kommt die unsafe:?

+1

Beachten Sie, dass Sie 'verwenden sollten ng-href' in diesem Fall und nicht nur 'href': https://docs.angularjs.org/api/ng/directive/ngHref – hartz89

Antwort

320

Sie müssen explizit einen regulären Ausdruck URL Protokolle Angular Whitelist hinzuzufügen. Nur http, https, ftp und mailto sind standardmäßig aktiviert. Angular wird bei Verwendung eines Protokolls wie chrome-extension: eine URL ohne Whitelist mit unsafe: voranstellen.

Ein guter Ort, um die weiße Liste der chrome-extension: Protokoll in Ihrem Modul Config Block würde:

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

Das gleiche Verfahren gilt auch, wenn Sie Protokolle wie file: und tel: verwenden müssen.

Weitere Informationen finden Sie im AngularJS $compileProvider API documentation.

+11

In Angular 1.2 wurde der Methodenname '$ compileProvider.aHrefSanitizationWhitelist' – Mart

+6

Default imgSrcSanitizationWhitelist Angular 1.2-rc2 ist'/^ \ s * (https? | Ftp | Datei): | data: image \ // ', um auf das lokale zuzugreifen Dateisystem für eine Chrome-Paket-App '| filesystem: chrome-extension:' sollte am Ende der Regex hinzugefügt werden. – Henning

+26

Beachten Sie, dass es in Angular 1.2 tatsächlich zwei Methoden gibt - eine für Links (aHrefSanitizationWhitelist) und eine für Bilder (imgSrcSanitizationWhitelist). Das hat mich für eine Weile festgehalten. – mdierker

2

Google Chrome benötigt seine Erweiterungen zur Zusammenarbeit mit Content Security Policy (CSP).

Sie müssen Ihre Erweiterung ändern, um die Anforderungen von CSP zu erfüllen.

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

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

Auch hat AngularJS ngCsp Richtlinie, die Sie verwenden müssen.

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

+0

Ich habe bereits die ngCsp-Direktive für diese Seite '". Dies ist der CSP von meinem Manifest: ' "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; Objekt-src 'Selbst',"' Muss ich ändern müssen die CSP im Manifest? – ebi

46

Falls jemand hat dieses Problem mit Bildern, wie auch:

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

Ich habe versucht, den regulären Ausdruck zu verwenden, um die Screenshots, die ich mit html2canvas aufgenommen habe, aufzulisten. Jetzt gibt es keinen Fehler mehr, der unsichere sagt: data; aber das Bild wird nicht erfasst. Irgendeine Idee, welchen regulären Ausdruck ich verwenden soll? Ich erfasse ein Bild/PNG als Base64 URL. Jetzt sieht der HTML-Code wie folgt aus: anstelle der tatsächlichen base64-URL – Srini

3

Wenn Sie nur für E-Mail benötigen, tel und SMS verwenden diese:

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