动态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 相关文章推荐
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
Mar 10 Javascript
一个很酷的拖动层的js类,兼容IE及Firefox
Jun 23 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
Oct 29 Javascript
JavaScript的继承的封装介绍
Oct 15 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
Oct 29 Javascript
写给小白的JavaScript引擎指南
Dec 04 Javascript
微信小程序组件之srcoll-view的详解
Oct 19 Javascript
JavaScript常用工具方法封装
Feb 12 Javascript
小试小程序云开发(小结)
Jun 06 Javascript
JavaScript this在函数中的指向及实例详解
Oct 14 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
Sep 27 Javascript
通过JS判断网页是否为手机打开
Oct 28 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
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
php购物网站支付paypal使用方法
2010/11/28 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
如何在PHP中使用数组
2020/06/09 PHP
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
python实现日常记账本小程序
2018/03/10 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
python日期相关操作实例小结
2019/06/24 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
详解python 中in 的 用法
2019/12/12 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
python求解汉诺塔游戏
2020/07/09 Python
学习考察心得体会
2014/09/04 职场文书
领导离职感言
2015/08/03 职场文书
Python读写yaml文件
2022/03/20 Python