AngularJS 使用$sce控制代碼安全檢查
由于瀏覽器都有同源加載策略,不能加載不同域下的文件、也不能使用不合要求的協(xié)議比如file進(jìn)行訪問。
在angularJs中為了避免安全漏洞,一些ng-src或者ng-include都會(huì)進(jìn)行安全校驗(yàn),因此常常會(huì)遇到 一個(gè)iframe中的ng-src無法使用。
什么是SCE
SCE,即strict contextual escaping,我的理解是 嚴(yán)格的上下文隔離 ...翻譯的可能不準(zhǔn)確,但是通過字面理解,應(yīng)該是angularjs嚴(yán)格的控制上下文訪問。
由于angular默認(rèn)是開啟SCE的,因此也就是說默認(rèn)會(huì)決絕一些不安全的行為,比如你使用了某個(gè)第三方的腳本或者庫(kù)、加載了一段html等等。
這樣做確實(shí)是安全了,避免一些跨站XSS,但是有時(shí)候我們自己想要加載特定的文件,這時(shí)候怎么辦呢?
此時(shí)可以通過$sce服務(wù)把一些地址變成安全的、授權(quán)的鏈接...簡(jiǎn)單地說, 就像告訴門衛(wèi),這個(gè)陌生人其實(shí)是我的好朋友,很值得信賴,不必?cái)r截它!
常用的方法有:
$sce.trustAs(type,name);
$sce.trustAsHtml(value);
$sce.trustAsUrl(value);
$sce.trustAsResourceUrl(value);
$sce.trustAsJs(value);
其中后面的幾個(gè)都是基于第一個(gè)api使用的,比如trsutAsUrl其實(shí)調(diào)用的是trsutAs($sce.URL,"xxxx");
其中 type 可選的值為:
$sce.HTML
$sce.CSS
$sce.URL //a標(biāo)簽中的href , img標(biāo)簽中的src
$sce.RESOURCE_URL //ng-include,src或者ngSrc,比如iframe或者Object
$sce.JS
來自官網(wǎng)的例子: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>
實(shí)際工作中的例子: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/");//等同于這個(gè)方法
}]);
</script>
</body>
</html>
還有點(diǎn)時(shí)間,接著給大家介紹angular中的ng-bind-html指令和$sce服務(wù)
angular js的強(qiáng)大之處之一就是他的數(shù)據(jù)雙向綁定這一牛B功能,我們會(huì)常常用到的兩個(gè)東西就是ng-bind和針對(duì)form的ng-model。但在我們的項(xiàng)目當(dāng)中會(huì)遇到這樣的情況,后臺(tái)返回的數(shù)據(jù)中帶有各種各樣的html標(biāo)簽。如:
$scope.currentWork.description = “hello,<br><b>今天我們?nèi)ツ睦铮?lt;/b>”
我們用ng-bind-html這樣的指令來綁定,結(jié)果卻不是我們想要的。是這樣的
hello,
今天我們?nèi)ツ睦铮?/p>
怎么辦呢?
對(duì)于angular 1.2一下的版本我們必須要使用$sce這個(gè)服務(wù)來解決我們的問題。所謂sce即“Strict Contextual Escaping”的縮寫。翻譯成中文就是“嚴(yán)格的上下文模式”也可以理解為安全綁定吧。來看看怎么用吧。
controller code:
$http.get('/api/work/get?workId=' + $routeParams.workId).success(function (work) {$scope.currentWork = work;});
HTML code:
<p> {{currentWork.description}}</p>
我們返回的內(nèi)容中包含一系列的html標(biāo)記。表現(xiàn)出來的結(jié)果就如我們文章開頭所說的那樣。這時(shí)候我們必須告訴它安全綁定。它可以通過使用$ sce.trustAsHtml()。該方法將值轉(zhuǎn)換為特權(quán)所接受并能安全地使用“ng-bind-html”。所以,我們必須在我們的控制器中引入$sce服務(wù)
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>
這樣結(jié)果就完美的呈現(xiàn)在頁(yè)面上了:
hello
今天我們?nèi)ツ睦铮?/p>
咱們還可以這樣用,把它封裝成一個(gè)過濾器就可以在模板上隨時(shí)調(diào)用了
app.filter('to_trusted', ['$sce', function ($sce) {
return function (text) {
return $sce.trustAsHtml(text);
};
}]);
html code:
全選復(fù)制放進(jìn)筆記
<p ng-bind-html="currentWork.description | to_trusted"></p>
相關(guān)文章
Angularjs 實(shí)現(xiàn)一個(gè)幻燈片示例代碼
本文主要介紹Angularjs 寫一個(gè)幻燈片的知識(shí),這里整理了詳細(xì)的資料,及實(shí)現(xiàn)代碼和實(shí)現(xiàn)效果圖有需要的小伙伴可以參考下2016-09-09
基于AngularJS實(shí)現(xiàn)的工資計(jì)算器實(shí)例
這篇文章主要介紹了基于AngularJS實(shí)現(xiàn)的工資計(jì)算器,結(jié)合具體實(shí)例形式分析了AngularJS數(shù)值計(jì)算相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
AngularJS 中的數(shù)據(jù)源的循環(huán)輸出
這篇文章主要介紹了AngularJS 中的數(shù)據(jù)源的循環(huán)輸出的相關(guān)資料,希望通過本文能幫助到大家,實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10
詳解Angular項(xiàng)目中共享模塊的實(shí)現(xiàn)
本文主要介紹了Angular的共享模塊的實(shí)現(xiàn),對(duì)此感興趣的同學(xué),可以實(shí)驗(yàn)一下2021-05-05
詳解使用angularjs的ng-options時(shí)如何設(shè)置默認(rèn)值(初始值)
本篇文章主要介紹了詳解使用angularjs的ng-options時(shí)如何設(shè)置默認(rèn)值(初始值),具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07
ionic使用angularjs表單驗(yàn)證(模板驗(yàn)證)
能夠驗(yàn)證用戶在表單中輸入的內(nèi)容是否合理與正確是十分重要的,這篇文章主要介紹了ionic使用angularjs表單驗(yàn)證(模板驗(yàn)證),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12

