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


Posted in Javascript onJanuary 05, 2016

由于浏览器都有同源加载策略,不能加载不同域下的文件、也不能使用不合要求的协议比如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>
Javascript 相关文章推荐
Javascript Object.extend
May 18 Javascript
javascript开发技术大全 第4章 直接量与字符集
Jul 03 Javascript
javascript类型转换使用方法
Feb 08 Javascript
javascript文本框内输入文字倒计数的方法
Feb 24 Javascript
jquery实现表单验证简单实例演示
Nov 23 Javascript
整理Javascript流程控制语句学习笔记
Nov 29 Javascript
Bootstrap基本样式学习笔记之表格(2)
Dec 07 Javascript
解决Angular2 router.navigate刷新页面的问题
Aug 31 Javascript
js实现动态增加文件域表单功能
Oct 22 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
May 05 Javascript
vue在线动态切换主题色方案
Mar 26 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
Aug 25 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
Jan 05 #Javascript
浅谈javascript 函数表达式和函数声明的区别
Jan 05 #Javascript
JavaScript实现下拉菜单的显示和隐藏
Jan 05 #Javascript
jQuery实现二级下拉菜单效果
Jan 05 #Javascript
基于JavaScript实现简单的随机抽奖小程序
Jan 05 #Javascript
jquery中ajax处理跨域的三大方式
Jan 05 #Javascript
基于JavaScript代码实现随机漂浮图片广告
Jan 05 #Javascript
You might like
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
smarty中post用法实例
2014/11/28 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
js资料toString 方法
2007/03/13 Javascript
JS 动态加载脚本的4种方法
2009/05/05 Javascript
JavaScript Cookie的读取和写入函数
2009/12/08 Javascript
aspx中利用js实现确认删除代码
2010/07/22 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
Python 文件重命名工具代码
2009/07/26 Python
详解Python之unittest单元测试代码
2018/01/24 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
python计算无向图节点度的实例代码
2019/11/22 Python
浅谈django channels 路由误导
2020/05/28 Python
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
保护环境倡议书500字
2014/05/19 职场文书
教师节学生演讲稿
2014/09/03 职场文书
银行委托书范本
2014/09/28 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
世界红十字日活动总结
2015/02/10 职场文书
财务部岗位职责范本
2015/04/14 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python