动态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所造成危害的全部内容了,希望这篇文章能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。
FAQs in section [23]: [23.1] 基类的非虚函数调用虚函数可以吗? [23.2] 上面那个FAQ让我糊涂了。那是使用虚函数的另一种策略吗? [23.3] 当基类构造函数调用虚函数时,为什么不调用派生类重写的该虚函数? [23.4] 派生类可以重置(“覆盖”)基类的非虚函数吗? [23.5] “Warning: Derived::f(float) hides Base::f(
本文向大家介绍关于JavaScript数组你所不知道的3件事,包括了关于JavaScript数组你所不知道的3件事的使用技巧和注意事项,需要的朋友参考一下 在编程语言当中,数组(Array)是一个非常常用的功能;它是一种特殊的变量,可以用来同时储存多个数值。然而,在JavaScript方面,数组的功能还有很多其他值得探索的地方。 在这篇文章中,我们将会讨论JavaScript数组的三个并不那么常见
本文向大家介绍你或许不知道的一些npm实用技巧,包括了你或许不知道的一些npm实用技巧的使用技巧和注意事项,需要的朋友参考一下 前言 绝大多数前端和 Node.js 开发者每天的日常工作都离不开 npm,不知道你对 npm 的观感如何?如果你觉得 npm 很棒,那么不妨看下这篇文章,说不定其中有你之前没留意过的小窍门,可以让你 npm 用得更顺手。如果你觉得 npm 很糟糕,那也可以看下这篇文章,
本文向大家介绍你所知道微服务的技术栈有哪些?列举一二。相关面试题,主要包含被问及你所知道微服务的技术栈有哪些?列举一二。时的应答技巧和注意事项,需要的朋友参考一下 微服务条目 落地技术 服务开发 SpringBoot、Spring、SpringMVC 服务配置与管理 Netfix公司的Archaius、阿里的Dlamond等 服务注册与发现 Eurka、Consul、Zookeeper等 服务调用
在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如: class Animal(object): def __init__(self, name): self.name = name def greet(self): print '
本文向大家介绍浅谈JavaScript中你可能不知道URL构造函数的属性,包括了浅谈JavaScript中你可能不知道URL构造函数的属性的使用技巧和注意事项,需要的朋友参考一下 URL URL 是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它, 在