2016-01-20 88 views
7

我有一個翻譯鍵,它實際上是一個HTML代碼,既編碼也不編碼。角度翻譯指令vs過濾器:XSS可能嗎?

$scope.translations = { 
    "html_code" : "<script>alert('Alert!');</script>", 
    "html_code_full" : "<script>alert('Alert!');</script>", 
    "greeting" : "Welcome!" 
    } 

當我使用這些值顯示在視圖中的翻譯文本,我使用兩種方法:

  1. 作爲指令<span translate>{{translations.html_code}}</span>
  2. 作爲過濾{{translations.html_code|translate}}

我嘗試同樣的爲translations.html_code_full。 下面是視圖代碼:

translations.html_code = {{translations.html_code|translate}} 
translations.html_code = <span translate>{{translations.html_code}}</span> 

translations.html_code_full = {{translations.html_code_full|translate}} 
translations.html_code_full = <span translate>{{translations.html_code_full}}</span> 

這是輸出我得到:

translations.html_code = &lt;script&gt;alert('Alert!');&lt;/script&gt; 
translations.html_code = <script>alert('Alert!');</script> 


translations.html_code_full = <script>alert('Alert!');</script> 
translations.html_code_full = 

由於很顯然,指令實現編碼轉換關鍵HTML,但濾波器不是。爲什麼指令與過濾器實現之間的輸出差異? 爲什麼我沒有得到一個警報,如果它呈現HTML?

Here is the plunk我爲演示創建。

回答

1

AngularJS框架工作正在保護您的應用程序免受XSS攻擊。

在網站上進行跨站點腳本佔賽門鐵克記錄的所有安全漏洞的大約84%,爲2007年

- Wikipedia - Cross-site scripting

那麼,什麼是你真正試圖做什麼?也許我們可以告訴你如何以安全的方式做到這一點。

+0

這正是我想要做的。在另一個網絡應用程序中,我能夠獲得警報,但不知何故,我無法在演示中重現。我只是想知道*安全*的方式來使用翻譯,即過濾器vs指令,以防止XSS。 –

+0

[AngularJS開發人員指南 - 安全性](https://docs.angularjs.org/guide/security)是一個很好的開始。然後查看[AngularJS $ sce API參考](https://docs.angularjs.org/api/ng/service/$sce)。 SCE協助編寫代碼的方式是:(a)默認安全,(b)更容易對諸如XSS,clickjacking等安全漏洞進行審計。 – georgeawg

+2

我有同樣的問題。我可以在我的應用程序中使用translate DIRECTIVE在本地複製css攻擊,而過濾器似乎是安全的 - 但是如果我嘗試製作反映此問題的plunkr,則css無法正常工作,並且腳本會被正確過濾掉。嘗試ng-translate的2.8.1和2.9.0版本。嘗試了不同的衛生戰略,但也沒有工作。我想知道是否有翻譯指令的安全漏洞。 –

0

對我來說,翻譯庫沒有涵蓋所有的實例。所以我需要涵蓋正常的腳本攻擊和角度攻擊。我們將URL的一部分作爲關鍵字讀取,然後將其顯示爲可在URL中進行攻擊的消息。

,我對所測試的2個網址:

/mypage.html#/{{{}.")));alert(1)//";}} 

mypage.html#/%3Cscript%3Ealert('foo')%20%3C/script%3E 

對於我來說,如果使用網頁的翻譯指令,但沒有過濾器的第一個會被正確地轉義。第二個是在頁面中使用指令時的成功攻擊,但在使用過濾器時被正確轉義。

最後,我在控制器中轉義,翻譯和檢查之後,纔將值賦給scope變量。所以現在在頁面中沒有翻譯指令或過濾器。

function translateParam(paramData, defaultKey){ 
     var deferred = $q.defer(); 
     var trusted = $sce.trustAsHtml(paramData); 
     $translate(trusted).then(
      function(translatedString){ 
       if(translatedString == trusted){ 
        //no key has been found so show a default 
        deferred.resolve($translate.instant(defaultKey)); 
       } 
       else{ 
        //the key has been found correclty 
        deferred.resolve(translatedString); 
       } 
      } 
     ); 
     return deferred.promise; 
    } 

//called like this 
    $scope.error = translateParam('keyFromURL','defaultKeyInTranslateFile'); 

您需要注入$ q,$ sce和$ translate。對我而言,這是最安全可靠的解決方案。