2013-03-26 72 views
21

在AngularJS中,在以下情況下,Firefox會將unsafe:放在以下列方式生成的網址之前。然後顯示一個錯誤頁面,說「地址不明白」。這是我本地PC上的文件請求。角度不安全鏈接

鏈接:

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

陣:

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

嘗試使用'ng-href'..see文檔 – charlietfl 2013-03-26 12:42:27

回答

45

您看到的副作用此承諾: https://github.com/angular/angular.js/commit/9532234bf1c408af9a6fd2c4743fdb585b920531,旨在解決一些安全隱患。

這次提交引入開始file:// URL的非向後兼容的改變(它https://github.com/angular/angular.js/commit/7b236b29aa3a6f6dfe722815e0a2667d9b7f0899

隨後放鬆我假設你正在使用或1.0.5一個1.1.3版本AngularJS。如果是這樣你通過配置$compileProvider像這樣可以重新啓用爲file://網址的支持:

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

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

}); 

或者在角1.2.8及以上版本:

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

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

}); 
+1

謝謝,但我需要把這段代碼放在哪裏?如果我只是把它放到我的控制器中(並將$ compileProvider添加到參數列表中),它會顯示「錯誤:未知提供者:$ compileProviderProvider」。 我使用1.0.5(最新來自谷歌開發人員)。 – Ben 2013-03-26 13:13:31

+0

順便說一句,快速修復只是使用1.0.4。 – Ben 2013-03-26 13:21:43

+1

@您需要將此代碼放入模塊的配置塊中,如我的響應(以及與之一起使用的源代碼)中所述。你可以在這裏閱讀有關模塊:http://docs.angularjs。org/guide/module當然,恢復到1.0.4會使問題消失,因爲只有1.0.5和1.1.3會受到影響。 – 2013-03-26 13:25:35

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

For Angular 1.2+ I used a類似的解決方案從這個線程:http://stackoverflow.com/questions/15606751/angular-changes-urls-to-unsafe-in-extension-page – 2014-04-25 02:38:21

4

向控制器添加白名單。

對於Angular.js 1.2:

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

對於角1.1.x和1.0.x中,使用urlSanitizationWhitelist。 見reference

1

我使用angular 1.4.0和格式如下工作:

ng-href="http://{{baseURLHref}}{{baseURLPort}}/routingPathName" 

ng-href在擺脫附加了unsafe的幫助開頭添加http://通過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(); 
    } 
    ...