AngularJS 使用$sce控制代码安全检查

因为浏览器都有同源加载策略,不能加载不一样域下的文件、也不能使用不合要求的协议好比file进行访问。javascript

在angularJs中为了不安全漏洞,一些ng-src或者ng-include都会进行安全校验,所以经常会遇到一个iframe中的ng-src没法使用。html

什么是SCE

SCE,即strict contextual escaping,个人理解是 严格的上下文隔离 ...翻译的可能不许确,可是经过字面理解,应该是angularjs严格的控制上下文访问。java

因为angular默认是开启SCE的,所以也就是说默认会决绝一些不安全的行为,好比你使用了某个第三方的脚本或者库、加载了一段html等等。angularjs

这样作确实是安全了,避免一些跨站XSS,可是有时候咱们本身想要加载特定的文件,这时候怎么办呢?web

此时能够经过$sce服务把一些地址变成安全的、受权的连接...简单地说,就像告诉门卫,这个陌生人实际上是个人好朋友,很值得信赖,没必要拦截它!api

经常使用的方法有:浏览器

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

其中后面的几个都是基于第一个api使用的,好比trsutAsUrl其实调用的是trsutAs($sce.URL,"xxxx");安全

其中type可选的值为:app

$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>

参考

【1】angular源码分析:angular中入境检察官$sceless

【2】野兽的 Angular 学习 - - sce和sce和sceDelegate

【3】$sce官方手册

相关文章
相关标签/搜索