AngularJS altera URLs para "não seguro:" na página de extensão

186

Estou tentando usar o Angular com uma lista de aplicativos, e cada um é um link para ver um aplicativo em mais detalhes ( apps/app.id):

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

Sempre que clico em um desses links, o Chrome mostra o URL como

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

De onde unsafe:vem isso?

ebi
fonte
1
Tenha em mente que você deve usar ng-hrefneste caso, ao invés de apenas href: docs.angularjs.org/api/ng/directive/ngHref
hartz89
Eu só uso um método de controladorfunction gotoURL(url) { $window.location.href = url; }
Todd Hale

Respostas:

362

Você precisa adicionar explicitamente protocolos de URL à lista de permissões do Angular usando uma expressão regular. Apenas http, https, ftpe mailtosão ativadas por padrão. O Angular prefixará um URL que não esteja na lista de permissões unsafe:ao usar um protocolo como chrome-extension:.

Um bom lugar para colocar na lista branca o chrome-extension:protocolo seria no bloco de configuração do seu módulo:

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

O mesmo procedimento também se aplica quando você precisa usar protocolos como file:e tel:.

Consulte a documentação da API AngularJS $ compileProvider para obter mais informações.

Philip Bulley
fonte
11
No Angular 1.2, o nome do método tornou$compileProvider.aHrefSanitizationWhitelist
Mart
6
O padrão imgSrcSanitizationWhitelist Angular 1.2-rc2 é que /^\s*(https?|ftp|file):|data:image\//, para acessar o sistema de arquivos local de um aplicativo compactado no Chrome, ele |filesystem:chrome-extension:deve ser adicionado ao final da regex.
Henning
29
Observe que no Angular 1.2, existem dois métodos - um para links (aHrefSanitizationWhitelist) e outro para imagens (imgSrcSanitizationWhitelist). Isso me deixou preso por um tempo.
Mdierker
1
Para um aplicativo empacotado do Chrome, você precisará adicionar |blob:chrome-extension:ao final.
adam8810
1
Observe o protocolo de arquivo é diferente do protocolo blob: $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|file|blob|ftp|mailto|chrome-extension):/);
Arnaud Leyder
56

Caso alguém também tenha esse problema com imagens:

app.config(['$compileProvider', function ($compileProvider) {
    $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);
}]);
R. Salisbury
fonte
Tentei usar a expressão regular para listar em branco as capturas de tela da imagem que estou capturando com html2canvas, agora não há erro que diga inseguro: dados; mas a imagem não está sendo capturada. Alguma idéia de qual expressão regular devo usar? Estou capturando uma imagem / png como base64 url. Agora o código HTML se parece com: <img ng-src = "dados :," class = src "img-responsivo" = "Dados:"> em vez da url base64 real
hakuna
6

Se você precisar apenas de correio, tel e sms, use o seguinte:

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

O Google Chrome exige que suas extensões cooperem Content Security Policy (CSP).

Você precisa modificar sua extensão para atender aos requisitos de CSP.

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

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

Além disso, angularJS possui uma ngCspdiretiva que você precisa usar.

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

Umur Kontacı
fonte
Eu já tenho a diretiva ngCsp para essa página '<html ng-app = "myApp" ng-csp>'. Este é o CSP do meu manifesto: "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", preciso alterar o csp no manifesto?
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):/);

        }]);
DC
fonte
2

Pois Angular 2+você pode usar DomSanitizero bypassSecurityTrustResourceUrlmétodo.

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

class ExampleComponent {
    sanitizedURL : SafeResourceUrl;

    constructor(
        private sanitizer: DomSanitizer){
        this.sanitizedURL = this.sanitizer.bypassSecurityTrustResourceUrl(); 
    }
}
Raman
fonte
Oi, você pode fornecer um exemplo mais elaborado para o mesmo.
Jayesh Choudhary
Oi @JayeshChoudhary, Você pode me informar o que está procurando especificamente e posso ajudá-lo melhor.
Raman