zoukankan      html  css  js  c++  java
  • AngularJS 使用$sce控制代码安全检查

    由于浏览器都有同源加载策略,不能加载不同域下的文件、也不能使用不合要求的协议比如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=&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中入境检察官$sce

    【2】野兽的 Angular 学习 - - scesceDelegate

    【3】$sce官方手册

  • 相关阅读:
    搭建微信公众号,获取用户公开信息
    搭建ES搜索引擎,实时导入mysql数据进行查询
    切换linux的shell
    隐藏CMD窗口,使程序在后台执行
    通过ssh远程查看java版本与在客户端查看不一致
    项目升级tomcat,修复漏洞
    springboot重定向后,https变成http
    【数论】【Polya定理】【枚举约数】【欧拉函数】【Java】poj2154 Color
    【数论】【Polya定理】poj1286 Necklace of Beads
    【置换群】poj3270 Cow Sorting
  • 原文地址:https://www.cnblogs.com/feng18/p/5139737.html
Copyright © 2011-2022 走看看