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 相关文章推荐
Ctrl+Enter提交内容信息
Jun 26 Javascript
通过url查找a元素应用案例
Apr 29 Javascript
javascript获取文档坐标和视口坐标
May 26 Javascript
Bootstrap每天必学之简单入门
Nov 19 Javascript
js获取及修改网页背景色和字体色的方法
Dec 29 Javascript
jQuery的内容过滤选择器学习教程
Apr 18 Javascript
jQuery 实现评论等级好评差评特效
May 06 Javascript
jQuery+正则+文本框只能输入数字的实现方法
Oct 07 Javascript
从零学习node.js之express入门(六)
Feb 25 Javascript
jQuery制作input提示内容(兼容IE8以上)
Jul 05 jQuery
js学习总结之dom2级事件基础知识详解
Jul 27 Javascript
JavaScript 判断数据类型的4种方法
Sep 11 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
处理单名多值表单的详解
2013/06/08 PHP
php使用session二维数组实例
2014/11/06 PHP
微信自定义分享php代码分析
2016/11/24 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
ajax 缓存 问题 requestheader
2010/08/01 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
JS 修改URL参数(实现代码)
2013/07/08 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
Vue 中mixin 的用法详解
2018/04/23 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
python实现的解析crontab配置文件代码
2014/06/30 Python
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
python ubplot使用方法解析
2020/01/10 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
英国DIY汽车维修配件网站:DIY Car Service Parts
2019/08/30 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
2015初中生物教研组工作总结
2015/07/21 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书