AngularJS使用$sce控制程式碼安全檢查

青夜之衫發表於2017-12-04

什麼是SCE

SCE,即strict contextual escaping,我的理解是 嚴格的上下文隔離 …翻譯的可能不準確,但是通過字面理解,應該是angularjs嚴格的控制上下文訪問。

由於angular預設是開啟SCE的,因此也就是說預設會決絕一些不安全的行為,比如你使用了某個第三方的指令碼或者庫、載入了一段html等等。

這樣做確實是安全了,避免一些跨站XSS,但是有時候我們自己想要載入特定的檔案,這時候怎麼辦呢?

此時可以通過$sce服務把一些地址變成安全的、授權的連結…簡單地說,就像告訴門衛,這個陌生人其實是我的好朋友,很值得信賴,不必攔截它!

常用的方法有:

$sce.trustAs(type,name);
$sce.trustAsHtml(value);
$sce.trustAsUrl(value);
$sce.trustAsResourceUrl(value);
$sce.trustAsJs(value);

其中後面的幾個都是基於第一個api使用的,比如trsutAsUrl其實呼叫的是trsutAs($sce.URL,”xxxx”);

其中type可選的值為:

$sce.HTML
$sce.CSS
$sce.URL //a標籤中的href , img標籤中的src
$sce.RESOURCE_URL //ng-include,src或者ngSrc,比如iframe或者Object
$sce.JS

來自官網的例子:ng-bind-html

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
</head>
<body ng-app="mySceApp">
    <div ng-controller="AppController">
      <i ng-bind-html="explicitlyTrustedHtml" id="explicitlyTrustedHtml"></i>
    </div>
    <script type="text/javascript">
        angular.module(`mySceApp`,[])
        .controller(`AppController`, [`$scope`, `$sce`,
          function($scope, $sce) {
            $scope.explicitlyTrustedHtml = $sce.trustAsHtml(
                `<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ` +
                `sanitization.&quot;">Hover over this text.</span>`);
          }]);
    </script>
</body>
</html>

實際工作中的例子:ng-src連結

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
</head>
<body ng-app="mySceApp">
<div ng-controller="AppController">
    <iframe width="100%" height="100%" seamless frameborder="0" ng-src="{{trustSrc}}"></iframe>
</div>
    <script type="text/javascript">
        angular.module(`mySceApp`,[])
        .controller(`AppController`, [`$scope`,`$sce`,function($scope,$sce) {
            $scope.trustSrc = $sce.trustAs($sce.RESOURCE_URL,"http://fanyi.youdao.com/");
            // $scope.trustSrc = $sce.trustAsResourceUrl("http://fanyi.youdao.com/");//等同於這個方法
          }]);
    </script>
</body>
</html>

本文轉自部落格園xingoo的部落格,原文連結:AngularJS 使用$sce控制程式碼安全檢查,如需轉載請自行聯絡原博主。


相關文章