国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 10:51:40
字體:
來源:轉載
供稿:網友

由于瀏覽器都有同源加載策略,不能加載不同域下的文件、也不能使用不合要求的協議比如file進行訪問。

在angularJs中為了避免安全漏洞,一些ng-src或者ng-include都會進行安全校驗,因此常常會遇到 一個iframe中的ng-src無法使用。

什么是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="Explicitly trusted HTML bypasses ' +        'sanitization."">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>

還有點時間,接著給大家介紹angular中的ng-bind-html指令和$sce服務

angular js的強大之處之一就是他的數據雙向綁定這一牛B功能,我們會常常用到的兩個東西就是ng-bind和針對form的ng-model。但在我們的項目當中會遇到這樣的情況,后臺返回的數據中帶有各種各樣的html標簽。如:

$scope.currentWork.description = “hello,<br><b>今天我們去哪里?</b>”
我們用ng-bind-html這樣的指令來綁定,結果卻不是我們想要的。是這樣的

hello,

今天我們去哪里?

怎么辦呢?

對于angular 1.2一下的版本我們必須要使用$sce這個服務來解決我們的問題。所謂sce即“Strict Contextual Escaping”的縮寫。翻譯成中文就是“嚴格的上下文模式”也可以理解為安全綁定吧。來看看怎么用吧。

controller code:

$http.get('/api/work/get?workId=' + $routeParams.workId).success(function (work) {$scope.currentWork = work;});

HTML code:

<p> {{currentWork.description}}</p>

我們返回的內容中包含一系列的html標記。表現出來的結果就如我們文章開頭所說的那樣。這時候我們必須告訴它安全綁定。它可以通過使用$ sce.trustAsHtml()。該方法將值轉換為特權所接受并能安全地使用“ng-bind-html”。所以,我們必須在我們的控制器中引入$sce服務

controller('transferWorkStep2', ['$scope','$http','$routeParams','$sce', function ($scope,$http, $routeParams, $sce) {$http.get('/api/work/get?workId=' + $routeParams.workId).success(function (work) {  $scope.currentWork = work;  $scope.currentWork.description = $sce.trustAsHtml($rootScope.currentWork.description);});

html code:

<p ng-bind-html="currentWork.description"></p>

這樣結果就完美的呈現在頁面上了:

hello

今天我們去哪里?

咱們還可以這樣用,把它封裝成一個過濾器就可以在模板上隨時調用了

app.filter('to_trusted', ['$sce', function ($sce) {return function (text) {  return $sce.trustAsHtml(text);};}]);

html code:

全選復制放進筆記

<p ng-bind-html="currentWork.description | to_trusted"></p>
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凤阳县| 湖口县| 乐都县| 安国市| 营口市| 玉环县| 慈溪市| 察隅县| 涡阳县| 渭南市| 永吉县| 方城县| 江津市| 仙桃市| 德庆县| 永城市| 青铜峡市| 溆浦县| 亳州市| 白玉县| 高淳县| 藁城市| 高青县| 刚察县| 旅游| 南城县| 改则县| 翁牛特旗| 云阳县| 班玛县| 右玉县| 祁门县| 彭水| 延边| 富蕴县| 铜梁县| 星座| 上林县| 乌什县| 建宁县| 南部县|