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?


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 .


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):/);
}]);

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):/);
}]);

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


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):/);

        }]);

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(); 
    }
}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.