2013-03-25 11 views
156

Sto cercando di utilizzare angolare con un elenco di applicazioni, e ognuno è un link per vedere un app in modo più dettagliato (apps/app.id):angolari modifiche URL per "non sicuro:" nella pagina aggiuntiva

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

Ogni volta che faccio clic su uno di questi link, Chrome mostra l'URL come unsafe:chrome-extension://kpbipnfncdpgejhmdneaagc.../apps/app.id

Da dove proviene il numero unsafe:?

+1

Tenete a mente che si dovrebbe usare ' ng-href' in questo caso piuttosto che solo 'href': https://docs.angularjs.org/api/ng/directive/ngHref – hartz89

risposta

320

è necessario aggiungere esplicitamente protocolli URL alla lista bianca di angolare utilizzando un'espressione regolare. Solo http, https, ftp e mailto sono abilitati per impostazione predefinita. Angular inserirà come prefisso un URL non inserito nella whitelist con unsafe: quando si utilizza un protocollo come chrome-extension:.

Un buon posto per whitelist il protocollo chrome-extension: sarebbe nel blocco di configurazione del modulo:

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

La stessa procedura si applica anche quando è necessario utilizzare protocolli quali file: e tel:.

Vedere AngularJS $compileProvider API documentation per ulteriori informazioni.

+11

In Angular 1.2 il nome del metodo è diventato '$ compileProvider.aHrefSanitizationWhitelist' – Mart

+6

Default imgSrcSanitizationWhitelist Angular 1.2-rc2 è'/^ \ s * (https? | Ftp | file): | data: image \ // ', per accedere al locale file system per un'app packaged in chrome '| filesystem: chrome-extension:' dovrebbe essere aggiunto alla fine della regex. – Henning

+26

Si noti che in Angular 1.2 esistono due metodi: uno per i collegamenti (aHrefSanitizationWhitelist) e uno per le immagini (imgSrcSanitizationWhitelist). Questo mi ha bloccato per un po '. – mdierker

2

Google Chrome richiede che le sue estensioni collaborino con Content Security Policy (CSP).

È necessario modificare l'estensione per soddisfare i requisiti di CSP.

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

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

Inoltre, angularJS ha ngCsp direttiva che è necessario utilizzare.

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

+0

Ho già la direttiva ngCsp per quella pagina '". Questo è il CSP dal mio manifest: '" content_security_policy ":" script-src 'self' https://ssl.google-analytics.com; object-src 'self' ",' Devo cambiare il csp nel manifest? – ebi

46

Nel caso qualcuno ha questo problema con le immagini, così:

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

Ho provato ad utilizzare l'espressione regolare per il bianco che elenca le schermate immagine sto catturando con html2canvas, ora non v'è alcun errore che dice non sicuro: i dati; ma l'immagine non viene catturata. Qualche idea di quale espressione regolare userò? Sto catturando un'immagine/png come URL base64. Ora il codice HTML appare come: invece che l'url Base64 reale – Srini

3

Se avete solo bisogno per la posta, telefono e sms utilizzare questo:

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