这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章给大家整理了动态 JavaScript 所造成的一些大家可能不知道的危害,文章介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
动态 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>
当用户访问此站点的时候,由于
方法已经被攻击者重写了,所以当导入的 leak.js 的中的代码执行,调用
- JSON.strinify()
的方法的时候,实际上调用的是攻击者所写的方法。这样用户的信息就会被窃取了。
- JSON.stringify()
原型篡改
正如之前说过的一样,javaScript 是基于原型链的。当访问对象的一个属性的时候,JavaScript 解释器会通过原型链来进行寻找,直到找到这个属性为止。在下面的这段代码中,我们就会对这个问题有一个清晰的认识了。
假设在正常的脚本 leak.js 中的 JavaScript 的代码如下:
- (function(){
- var arr = ["secret1","secret2","secret3"];
- var x = arr.slice();
- })();
从代码中可以看到,在 arr 数组中存在了 3 个与用户有关的隐私数据。然后 arr 实例调用了
方法。很明显这个方法是不存在的。因为 arr 实例本身没有创建和声明这个方法,同时在 Array 对象中也没有这个方法。但是当出现一个这样的情况的时候,程序并没有报错,只是说明这个
- slice()
方法不存在而已。所以在这样的情况下,可能程序员也并不知道他所创建的 arr 实例有调用 slice() 这样的一个方法。那么上面的这段代码就很有可能会被攻击者所利用。
- 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 要执行
方法执行的时候,就会调用攻击者为 Array 添加的
- slice
方法,这样敏感数据就会发送到攻击者了。
- slice
防范
开发人员在进行网站开发的时候,最好是将代码与数据分开。敏感和重要的数据应该保存在单独的文件中,这样这些文件就不会被浏览器当作 JavaScript 来执行了。同时还需要为这些静态资源设置访问权限,只要在用户登录之后才可以访问,在这种情况下攻击者即使引入了这个静态资源也无法访问这个数据。
总结
以上就是关于动态 JavaScript 所造成危害的全部内容了,希望这篇文章能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。
来源: http://www.phperz.com/article/17/0513/331603.html