Небезопасная ссылка в angular

В AngularJS в следующем сценарии Firefox помещает unsafe: перед URL-адресами, которые генерируются следующим образом. Затем он отображает страницу с сообщением об ошибке "Адрес не был понят". Это запрос файла на моем локальном ПК.

Ссылка

<li ng-repeat="fruit in fruits">
    <a href="{{ fruit.link }}">{{ fruit.title }}</a>
</li>

Массив:

$scope.fruits = [
    {   "title"     :   "Orange",
        "link"      :   "fruits_orange.html"  }
];

Ответ 1

Вы видите побочный эффект этой фиксации: https://github.com/angular/angular.js/commit/9532234bf1c408af9a6fd2c4743fdb585b920531, целью которого является устранение некоторых угроз безопасности.

Эта фиксация внесла непереходное совместимое изменение для URL-адресов, начиная с file:// (впоследствии оно было смягчено в https://github.com/angular/angular.js/commit/7b236b29aa3a6f6dfe722815e0a2667d9b7f0899

Я предполагаю, что вы используете одну из версий 1.0.5 или 1.1.3 AngularJS. Если это так, вы можете повторно включить поддержку URL file://, настроив $compileProvider следующим образом:

angular.module('myModule', [], function ($compileProvider) {

  $compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file):/);

});

Или в Angular 1.2.8 и выше:

angular.module('myModule', [], function ($compileProvider) {

  $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file):/);

});

Ответ 2

Добавьте белый список к контроллеру.

Для Angular.js 1.2:

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

Для Angular 1.1.x и 1.0.x используйте urlSanitizationWhitelist. См. ссылка.

Ответ 3

    angular.module('somemodule').config(['$compileProvider' , function ($compileProvider)
    {
          $compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto):/);
    }]);

Ответ 4

Я использую angular 1.4.0 и работал следующий формат:

ng-href="#" onclick="location.href='http://{{baseURLHref}}{{baseURLPort}}/routingPathName'; return false;"

Добавление http:// в начало ng-href помогло избавиться от unsafe, добавленного ng-Sanitize

  • Если вы находитесь на https, тогда не должно быть проблем с жестким кодом.
  • Но если у вас есть система, которая должна работать в обеих средах, вы можете использовать обнаружение протокола из location.protocol

Я устанавливаю переменные в $rootScope (они помогают с проблемами с прокси-серверами, которые потребляют css с моего сайта)

angular.module('myApp').run(function ($route, $rootScope, $location) {
    $rootScope.baseURLHref = '';
    $rootScope.baseURLPort = '';
    if($location.host() != 'localhost'){
      $rootScope.baseURLHref = $location.host();
      $rootScope.baseURLPort = ':' + $location.port();
    }
    ...