动态JavaScript所造成一些你不知道的危害


Posted in Javascript onSeptember 25, 2016

动态JavaScript

JavaScript代码很多时候会通过服务器端的带啊名来动态地组合到一起。在这个组合的过程中,与用户相关的信息会保存到这些JavaScript的代码中。当将这个JavaScript脚本传送到浏览端的时候,客户端的JavaScript会立即投入使用。但是实际情况是,这些脚本很有可能会被第三方的所引入,而引入这些脚本是没有同源策略的限制的。因此,一个被攻击者所控制的网页很有可能同样被包含引入动态生成的JavaScript脚本然后观察这个脚本的执行情况以及可能存在的安全的问题。由于通过src方式导入的所有的JavaScript脚本和本地的脚本都是会共享全局变量的。因而,如果这样的一个动态脚本包含了用户的隐私数据,那么攻击者就通过引入这个脚本的方式就能够访问到这些数据。这种方式也被称之为跨站脚本包含(XSSI)。

JavaScript的语言特性

在动态Javacript的危害中主要是涉及到JavaScript的作用域、原型链继承这2个特性。

作用域的问题

JavaScript作用域的问题相信很多人都有所了解,不了解可以通过网上搜索看看。不像Java、C++这样的语言是存在块级作用域的,JavaScript仅仅是存在函数作用域。这就意味着JavaScript引擎会为每一个函数分配一个作用域。在函数内部中定义的变量所在的作用域就是在函数内,这种作用域就叫做本地作用域。下面的代码就很清楚地说明了全局作用域与本地作用域的区别。

原型链

在JavaScript中,每个创建的函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。在JavaScript中主要是通过原型链的方式作为继承的主要方法。其基本思想是利用原型让一个应用类型继承另一个应用类型的属性和方法。当访问一个对象的属性的时候,JavaScript就去判断当前这个对象本身是否含有这个属性,如果不存在就在对象的原型属性中寻找。

攻击方式

由于HTM中的script标签不受同源策略的影响。因而脚本资源能够导入到跨域的页面当中。虽然跨域的页面不能够直接访问到这些脚本的源代码,但是导入这个脚本之后可以观察这个脚本在页面中的执行情况。如果这样的一个动态脚本包含有用户的隐私数据,那么这种方式就有可能泄漏用户的数据。

基于全局变量的攻击

当导入的JavaScrpit中创建了一个全局变量,这个全局变量也是可以被页面中的JavaScript代码所访问的。因此如果一个动态脚本将用户的隐私数据赋值给了一个全局变量,那么攻击者就可以通过全局变量就可以访问到这个数据了。

假设在正常的脚本leak.js中的JavaScript代码如下:

(function() {
 window.secret = "345a8b7c9d8e34f5";
})();

可以看到,此脚本中将用户的隐私数据赋值给了windows全局变量。

恶意站点的代码为:

<script src="http://www.good.com/leak1.js"></script>
<script>
 var user_data= window.secret; 
 // send user data to hacker
 sendstolendata(user_data);
</script>

当用户访问到了含有上面的恶意代码的网站的时候,此网站就会通过window对象来获取用户数据然后发送给攻击者。

重新定义全局API攻击

由于JavaScript的动态性,导致很多的函数能够被攻击者重写,即使是那些JavaScript内置的函数。如果一个动态的JavaScript脚本通过一个系统中内置函数来传递隐私数据,那么攻击者在这个函数调用之前通过重写这个函数,就可以获取到用户的隐私数据了。

假设在正常的脚本leak.js中的JavaScript的代码如下:

(function() {
 var secret = "345a8b7c9d8e34f5";

 JSON.stringify(secret);
})();

可以发现,在这个代码中,调用了JavaScript语言中自带了的JSON.sttringify()的方法。而这个方法完全是可以被黑客所利用的。

以下是恶意站点中的代码:

<script type="text/javascript">
 JSON.stringify = function (user_data) {
  sendstolendata(user_data);
 }
</script>
<script type="text/javascript" src="http://www.good.com/leak.js"></script>

当用户访问此站点的时候,由于JSON.strinify()方法已经被攻击者重写了,所以当导入的leak.js的中的代码执行,调用JSON.stringify()的方法的时候,实际上调用的是攻击者所写的方法。这样用户的信息就会被窃取了。

原型篡改

正如之前说过的一样,javaScript是基于原型链的。当访问对象的一个属性的时候,JavaScript解释器会通过原型链来进行寻找,直到找到这个属性为止。在下面的这段代码中,我们就会对这个问题有一个清晰的认识了。

假设在正常的脚本leak.js中的JavaScript的代码如下:

(function(){
 var arr = ["secret1","secret2","secret3"];
 var x = arr.slice();
})();

从代码中可以看到,在arr数组中存在了3个与用户有关的隐私数据。然后arr实例调用了slice()方法。很明显这个方法是不存在的。因为arr实例本身没有创建和声明这个方法,同时在Array对象中也没有这个方法。但是当出现一个这样的情况的时候,程序并没有报错,只是说明这个slice方法不存在而已。所以在这样的情况下,可能程序员也并不知道他所创建的arr实例有调用slice()这样的一个方法。那么上面的这段代码就很有可能会被攻击者所利用。

以下是恶意站点的代码:

<script type="text/javascript">
Array.prototype.slice = function() {
 //send data to attacker
 sendToAttackBackend(this);
}
</script>
<script type="text/javascript" src="http://www.good.com/leak.js"></script>

当用户访问到这个含有恶意代码的网站的时候,导入的leak.js中的JavaScript要执行slice方法执行的时候,就会调用攻击者为Array添加的slice方法,这样敏感数据就会发送到攻击者了。

防范

开发人员在进行网站开发的时候,最好是将代码与数据分开。敏感和重要的数据应该保存在单独的文件中,这样这些文件就不会被浏览器当作JavaScript来执行了。同时还需要为这些静态资源设置访问权限,只要在用户登录之后才可以访问,在这种情况下攻击者即使引入了这个静态资源也无法访问这个数据。

总结

以上就是关于动态JavaScript所造成危害的全部内容了,希望这篇文章能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
Oct 29 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
Apr 19 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
May 29 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
Dec 01 Javascript
微信小程序实现图片预加载组件
Jan 18 Javascript
webpack2.0搭建前端项目的教程详解
Apr 05 Javascript
微信小程序实现多个按钮toggle功能的实例
Jun 13 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
Oct 12 Javascript
VUE预渲染及遇到的坑
Sep 03 Javascript
搭建一个Koa后端项目脚手架的方法步骤
May 30 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
Sep 06 Javascript
详解如何在JS代码中消灭for循环
Dec 11 Javascript
jQuery中的AjaxSubmit使用讲解
Sep 25 #Javascript
需要牢记的JavaScript基础知识
Sep 25 #Javascript
分享一个原生的JavaScript拖动方法
Sep 25 #Javascript
HTML中setCapture、releaseCapture 使用方法浅析
Sep 25 #Javascript
jQuery的deferred对象使用详解
Sep 25 #Javascript
简单谈谈Vue 模板各类数据绑定
Sep 25 #Javascript
D3.js实现直方图的方法详解
Sep 25 #Javascript
You might like
php,不用COM,生成excel文件
2006/10/09 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
环保倡议书400字
2014/05/15 职场文书
工程造价专业求职信
2014/07/17 职场文书
公证书
2019/04/17 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
Python 中random 库的详细使用
2021/06/03 Python
Python Pandas 删除列操作
2022/03/16 Python