簡體   English   中英

像這樣使用時,Object.prototype的語義是什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM