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 相关文章推荐
getElementById在任意一款浏览器中都可以用吗的疑问回复
May 13 Javascript
Javascript 匿名函数及其代码模式原理
Mar 19 Javascript
jQuery的cookie插件实现保存用户登陆信息
Apr 15 Javascript
javascript实现可全选、反选及删除表格的方法
May 15 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
Apr 26 Javascript
BootStrap响应式导航条实例介绍
May 06 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
Mar 14 Javascript
ES6下React组件的写法示例代码
May 04 Javascript
vue.js 使用axios实现下载功能的示例
Mar 05 Javascript
vue引用js文件的多种方式(推荐)
May 17 Javascript
Node.js从字符串生成文件流的实现方法
Aug 18 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 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简单浏览目录内容的实现代码
2013/06/07 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
php实现点击可刷新验证码
2015/11/07 PHP
利用php输出不同的心形图案
2016/04/22 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
es6基础学习之解构赋值
2018/12/10 Javascript
NodeJS有难度的面试题(能答对几个)
2019/10/09 NodeJs
vue实现打地鼠小游戏
2020/08/21 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
Python列表和元组的定义与使用操作示例
2017/07/26 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
利用python如何处理nc数据详解
2018/05/23 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
python argparser的具体使用
2019/11/10 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
详解CSS3中@media的实际使用
2015/08/04 HTML / CSS
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
公司委托书格式范本
2014/09/16 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
商标侵权律师函
2015/05/27 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers
nginx配置ssl实现https的方法示例
2021/03/31 Servers
python中的3种定义类方法
2021/11/27 Python
使用python创建股票的时间序列可视化分析
2022/03/03 Python