186 votes

AngularJS modifie les URL en les remplaçant par "unsafe:" dans la page d'extension

Je suis en train d'essayer d'utiliser Angular avec une liste d'applications, et chacune est un lien pour voir une application en détail (apps/app.id):

{{app.name}}

Chaque fois que je clique sur l'un de ces liens, Chrome montre l'URL comme

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

D'où vient le préfixe unsafe:?

1 votes

Gardez à l'esprit que vous devez utiliser ng-href dans ce cas plutôt que simplement href: docs.angularjs.org/api/ng/directive/ngHref

0 votes

Je viens d'utiliser une méthode de contrôleur function gotoURL(url) { $window.location.href = url; }

362voto

Philip Bulley Points 1675

Vous devez ajouter explicitement des protocoles d'URL à la liste blanche d'Angular en utilisant une expression régulière. Seuls http, https, ftp et mailto sont activés par défaut. Angular ajoutera un préfixe unsafe: à une URL qui n'est pas dans la liste blanche en utilisant un protocole tel que chrome-extension:.

Un bon endroit pour ajouter le protocole chrome-extension: à la liste blanche serait dans le bloc de configuration de votre module :

var app = angular.module( 'myApp', [] )
.config( [
    '$compileProvider',
    function( $compileProvider )
    {   
        $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|chrome-extension):/);
        // Avant la version 1.2 d'Angular, on utilisait $compileProvider.urlSanitizationWhitelist(...)
    }
]);

La même procédure s'applique également lorsque vous avez besoin d'utiliser des protocoles tels que file: et tel:.

Veuillez consulter la documentation de l'API $compileProvider d'AngularJS pour plus d'informations.

11 votes

En Angular 1.2, le nom de la méthode est devenu $compileProvider.aHrefSanitizationWhitelist

6 votes

La liste blanche de sanitization de imgSrc par défaut d'Angular 1.2-rc2 est /^\s*(https?|ftp|file):|data:image\//, pour accéder au système de fichiers local d'une application empaquetée Chrome, |filesystem:chrome-extension: doit être ajouté à la fin de l'expression régulière.

29 votes

Notez qu'en Angular 1.2, il y a en réalité deux méthodes -- Une pour les liens (aHrefSanitizationWhitelist) et une pour les images (imgSrcSanitizationWhitelist). Cela m'a bloqué pendant un certain temps.

58voto

R. Salisbury Points 1282

Si quelqu'un rencontre également ce problème avec les images :

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

6voto

Ivasyliv Points 61

Si vous avez uniquement besoin de mail, de téléphone et de SMS, utilisez ceci :

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

3voto

D C Points 136
 télécharger le CV

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

        }]);

2voto

Raman Points 1162

Pour Angular 2+, vous pouvez utiliser la méthode bypassSecurityTrustResourceUrl de DomSanitizer.

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

class ExampleComponent {
    sanitizedURL : SafeResourceUrl;

    constructor(
        private sanitizer: DomSanitizer){
        this.sanitizedURL = this.sanitizer.bypassSecurityTrustResourceUrl(); 
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X