动态JavaScript的安全隐患:XSSI攻击原理与防范

作者:听澜

时间:2026-10-30

浏览:161

动态生成的JavaScript脚本若包含用户隐私数据,通过全局变量或原型链机制可能被第三方恶意网站窃取。本文深入解析跨站脚本包含(XSSI)攻击原理,涵盖基于全局变量的数据泄露、重写内置函数以及篡改原型链三种主要攻击方式,并提供代码与数据分离等有效防范建议。

文章目录

动态JavaScript的安全隐患

动态JavaScript

在实际开发中,JavaScript代码常由服务器端动态拼接生成。在此过程中,与用户相关的敏感信息往往会被嵌入到这些JavaScript代码中。当脚本传输至客户端浏览器时,会立即执行。然而,这些脚本可能被第三方恶意网站通过<script>标签引入。由于通过src属性引入的JavaScript脚本不受同源策略限制,攻击者控制的网页可以包含并监控动态生成的JavaScript脚本的执行情况,从而挖掘潜在的安全问题。由于通过src导入的脚本与本地脚本共享全局变量,若动态脚本中包含了用户隐私数据,攻击者便可通过引入该脚本的方式访问这些数据。这种攻击手法被称为跨站脚本包含(XSSI)。

JavaScript的语言特性

动态JavaScript带来的安全风险主要涉及JavaScript的作用域机制和原型链继承这两个核心特性。

作用域的问题

JavaScript的作用域机制是理解此类安全问题的关键。与Java、C++等语言拥有块级作用域不同,JavaScript仅具备函数作用域。这意味着JavaScript引擎为每个函数分配一个独立的作用域。在函数内部定义的变量属于该函数的本地作用域。以下代码示例清晰展示了全局作用域与本地作用域的区别。

原型链

在JavaScript中,每个函数都拥有一个prototype(原型)属性,该属性是一个指向对象的指针,用于包含特定类型所有实例共享的属性和方法。JavaScript主要依靠原型链实现继承,其核心思想是利用原型使一个应用类型继承另一个应用类型的属性和方法。当访问对象属性时,JavaScript会先检查对象本身是否含有该属性;若不存在,则沿着原型链向上查找。

XSSI攻击原理

攻击方式

由于HTML中的<script>标签不受同源策略限制,脚本资源可以被引入到跨域页面中。虽然跨域页面无法直接读取这些脚本的源代码,但可以通过观察脚本在页面中的执行行为来推断数据。如果动态脚本中包含了用户的隐私数据,这种机制可能导致数据泄露。

基于全局变量的攻击

基于全局变量的攻击

当引入的JavaScript脚本创建了一个全局变量时,该变量可被页面中的其他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所造成危害的全部内容了,希望这篇文章能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章