AngularJS zmienia adresy URL na „niebezpieczne:” na stronie rozszerzenia

186

Próbuję używać Angulara z listą aplikacji, a każda z nich jest linkiem, aby zobaczyć aplikację bardziej szczegółowo ( apps/app.id):

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

Za każdym razem, gdy klikam jeden z tych łączy, Chrome wyświetla adres URL jako

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

Skąd unsafe:pochodzi?

ebi
źródło
1
Należy pamiętać, że należy ng-hrefw tym przypadku użyć zamiast href: docs.quarejs.org/api/ng/directive/ngHref
hartz89
Po prostu używam metody kontrolerafunction gotoURL(url) { $window.location.href = url; }
Todd Hale

Odpowiedzi:

362

Musisz jawnie dodać protokoły URL do białej listy Angulara, używając wyrażenia regularnego. Tylko http, https, ftpi mailtosą włączone domyślnie. Angular poprzedzi adres URL, który nie znajduje się na białej liście, unsafe:przy użyciu protokołu takiego jak chrome-extension:.

Dobrym miejscem do umieszczenia chrome-extension:protokołu na białej liście jest blok konfiguracji modułu:

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

Ta sama procedura dotyczy również protokołów, takich jak file:i tel:.

Więcej informacji można znaleźć w dokumentacji interfejsu API AngularJS $ compileProvider .

Philip Bulley
źródło
11
W kątowym 1,2 nazwa metoda stała$compileProvider.aHrefSanitizationWhitelist
Mart
6
Domyślnym imgSrcSanitizationWhitelist Angular 1.2-rc2 jest /^\s*(https?|ftp|file):|data:image\//, aby uzyskać dostęp do lokalnego systemu plików dla aplikacji w pakiecie chrome |filesystem:chrome-extension:należy dodać na końcu wyrażenia regularnego.
Henning,
29
Zauważ, że w Angular 1.2 istnieją dwie metody - Jedna dla linków (aHrefSanitizationWhitelist) i jedna dla obrazów (imgSrcSanitizationWhitelist). To utknęło mi na chwilę.
mdierker,
1
W przypadku aplikacji w pakiecie Chrome musisz ją dodać |blob:chrome-extension:na końcu.
adam8810
1
Uwaga: protokół pliku różni się od protokołu obiektu blob: $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|file|blob|ftp|mailto|chrome-extension):/);
Arnaud Leyder
56

W przypadku, gdy ktoś ma ten problem również z obrazami:

app.config(['$compileProvider', function ($compileProvider) {
    $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);
}]);
R. Salisbury
źródło
Próbowałem użyć wyrażenia regularnego dla białych list zrzutów ekranu, które przechwytuję za pomocą html2canvas, teraz nie ma błędu, który mówi „niebezpiecznie”: dane; ale obraz nie jest rejestrowany. Masz pojęcie, jakiego wyrażenia regularnego użyję? Przechwytuję obraz / png jako adres URL base64. Teraz html wygląda następująco: <img ng-src = "data :," class = "img-responsive" src = "data:,"> zamiast faktycznego adresu URL base64
hakuna
6

Jeśli potrzebujesz tylko poczty, tel i sms, użyj tego:

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

Google Chrome wymaga współpracy z rozszerzeniami Content Security Policy (CSP).

Musisz zmodyfikować swoje rozszerzenie, aby spełniało wymagania CSP.

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

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

Ponadto angularJS ma ngCspdyrektywę, której musisz użyć.

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

Umur Kontacı
źródło
Mam już dyrektywę ngCsp dla tej strony „<html ng-app =" myApp "ng-csp> '. Oto CSP z mojego manifestu: "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", Czy muszę zmienić csp w manifeście?
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
źródło
2

Dla Angular 2+można użyć DomSanitizer„s bypassSecurityTrustResourceUrlmetody.

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

class ExampleComponent {
    sanitizedURL : SafeResourceUrl;

    constructor(
        private sanitizer: DomSanitizer){
        this.sanitizedURL = this.sanitizer.bypassSecurityTrustResourceUrl(); 
    }
}
Raman
źródło
Cześć, Czy możesz podać bardziej szczegółowy przykład tego samego?
Jayesh Choudhary
Cześć @JayeshChoudhary, czy możesz dać mi znać, czego konkretnie szukasz, a mogę pomóc ci lepiej.
Raman