AngularJS змінює URL-адреси на "небезпечні:" на сторінці розширення


186

Я намагаюся використовувати Angular зі списком програм, і кожне з них - посилання, щоб докладніше переглянути додаток ( apps/app.id):

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

Кожен раз, коли я натискаю одне з цих посилань, Chrome показує URL-адресу як

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

Звідки береться unsafe:?


1
Майте на увазі, що вам слід скористатись ng-hrefу цьому випадку, а не просто href: docs.angularjs.org/api/ng/directive/ngHref
hartz89

Я просто використовую метод контролераfunction gotoURL(url) { $window.location.href = url; }
Тодд Хейл,

Відповіді:


362

Потрібно чітко додати протоколи URL-адрес до білого списку Angular, використовуючи регулярний вираз. Тільки http, https, ftpі mailtoвключені за замовчуванням. Кутовий буде встановлювати префікс URL-адреси, що не має списку, unsafe:при використанні такого протоколу, як chrome-extension:.

Хорошим місцем для створення списку chrome-extension:протоколу буде в конфігураційному блоці вашого модуля:

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

Ця ж процедура застосовується і тоді, коли вам потрібно використовувати протоколи, такі як file:і tel:.

Для отримання додаткової інформації див. Документацію API AngularJS $ compileProvider API .


11
У Angular 1.2 назва методу стала$compileProvider.aHrefSanitizationWhitelist
березня

6
За замовчуванням imgSrcSanitizationWhitelist Angular 1.2-rc2 є /^\s*(https?|ftp|file):|data:image\//, щоб отримати доступ до локальної файлової системи для хромованого додатка |filesystem:chrome-extension:слід додати до кінця регулярного виразу.
Хеннінг

29
Зауважте, що в Angular 1.2 існує фактично два способи - один для посилань (aHrefSanitizationWhitelist) та один для зображень (imgSrcSanitizationWhitelist). Це затримало мене на деякий час.
mdierker

1
Для пакетованого додатка Chrome потрібно додати |blob:chrome-extension:його до кінця.
adam8810

1
Зауважте, що протокол файлів відрізняється від протоколу blob: $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|file|blob|ftp|mailto|chrome-extension):/);
Арно Лейдер

56

Якщо у когось є проблема із зображеннями:

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

Я спробував використовувати регулярний вираз для білого списку знімків екрану зображень, які я захоплюю html2canvas, тепер немає помилки, яка говорить про небезпечну: дані; але зображення не захоплюється. Будь-яка ідея, яким регулярним виразом я буду користуватися? Я фіксую зображення / png як URL-адресу base64. Тепер html виглядає так: <img ng-src = "data :," class = "img-
respovable

6

Якщо вам просто потрібна пошта, tel та sms, скористайтеся цим:

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

2

Google Chrome вимагає розширення для співпраці Content Security Policy (CSP).

Вам потрібно змінити розширення, щоб виконати вимоги CSP.

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

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

Також у angularJS є ngCspдиректива, яку потрібно використовувати.

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


У мене вже є директива ngCsp для цієї сторінки '<html ng-app = "myApp" ng-csp>'. Це CSP з мого маніфесту: "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", чи потрібно мені змінювати csp в маніфесті?
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

Для цього Angular 2+можна використовувати метод DomSanitizer's bypassSecurityTrustResourceUrl.

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

class ExampleComponent {
    sanitizedURL : SafeResourceUrl;

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

Привіт, чи можете ви надати більш детальний приклад для того ж.
Jayesh

Привіт @JayeshChoudhary, Чи можете ви, будь ласка, повідомте мені, що саме ви шукаєте, і я можу вам допомогти краще.
Раман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.