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 相关文章推荐
setAttribute 与 class冲突解决
Feb 17 Javascript
点击进行复制的JS代码实例
Aug 23 Javascript
文本框水印提示效果的简单实现代码
Feb 22 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
Dec 02 Javascript
javascript编写简易计算器
May 06 Javascript
BootStrap表单控件之文本域textarea
May 23 Javascript
Node.js  REPL (交互式解释器)实例详解
Aug 06 Javascript
JQuery实现table中tr上移下移的示例(超简单)
Jan 08 jQuery
详解在vue-cli3.0中自定css、js和图片的打包路径
Aug 26 Javascript
基于layui的下拉列表的数据回显方法
Sep 24 Javascript
ElementUI多个子组件表单的校验管理实现
Nov 07 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写的serv-u的web申请账号的程序
2006/10/09 PHP
QueryPath PHP 中的jQuery
2010/04/11 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
jquery 学习笔记一
2010/04/07 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
2012/12/11 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
在Python程序中实现分布式进程的教程
2015/04/28 Python
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
环境工程专业毕业生求职信
2014/09/30 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
合作与交流自我评价
2015/03/09 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
党员转正党支部意见
2015/06/02 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL
Go语言读取txt文档的操作方法
2022/01/22 Golang