像这样使用时,Object.prototype的语义是什么

时间:2015-05-20 16:42:47

标签: javascript security

我在Javascript及其基于原型的模型方面有一点经验,但是我有以下Javascript代码段,它演示了我不理解的跨站点脚本攻击问题。调用Object.prototype时发生了什么,白名单数组如何更新?

function send (u,m) {console.log(m);}
function protect ( send ) {
var whitelist ={" https :// microsoft . com / mail ":true ,
" https :// microsoft . com / owa ": true };
return function (url , msg) {
if ( whitelist [ url ]) send (url , msg);
};
} send = protect ( send );
Object . prototype [" http :// evil . com "]= true ;
send (" http :// evil . com ", " bypass !");

1 个答案:

答案 0 :(得分:2)

  

调用Object.prototype时发生了什么

该行

Object.prototype [" http :// evil . com "] = true;

只会在Object.prototype上创建一个值为true的属性。这里没有其他事情发生。

  

如何更新白名单数组?

whitelist不是数组,它是用于地图的对象。作为所有对象,它确实继承自Object.prototype

在调用受保护的send函数之前,没有什么奇怪的事情发生。在那里,它会在url上查找已通过的whitelist作为属性。现在白名单没有这个属性(本身),所以 - 这里是原型继承发挥作用的地方 - 它检查它继承的对象。确实Object.prototype确实有这样的属性,查找将产生true,并且意外地满足您的条件。

  

演示跨站点脚本攻击问题的Javascript代码段

我不会称之为XSS攻击。它只是演示了如何强大的原型继承,以及混淆其他代码是多么容易(以及对protect任何东西的大多数尝试都是如此)。

然而,实际的攻击媒介和您的安全问题是,首先会在您的环境中评估像Object.prototype[…]=true;这样的恶意内容。如果你无法控制谁执行代码,那么它就不安全了。