2017-04-07 134 views
0

我在沒有清理外部數據的網站(siteName)中發現了一些javascript,但它的使用方式我認爲並不代表問題。當然,最好的做法是過濾它,以便只有期望的值可以與代碼交互,並且不會擔心意外的輸入。但是,目前的設置會造成多大的傷害?這可能被認爲是一個安全漏洞嗎?

var branding = { 
    'website1.com' : { 
     color: 'red' 
    }, 
    'website2.com' : { 
     color: 'blue' 
    } 
}; 

var siteName = document.referrer.split('/')[2]; 

var myElements = document.querySelectorAll(".some-class-name"); 

for (var i = 0; i < myElements.length; i++) { 
    myElements[i].style.color = branding[siteName]['color']; 
} 
+0

你無法用它做任何事情。 – zerkms

+0

一切客戶端不能以任何方式被認爲是安全的 –

+0

爲什麼這會是一個安全問題?你是說網站列表不應該公開,或者...? *有一個錯誤:如果引用者站點不在列表中,則會導致運行時異常 - 您談論的是否缺少了衛生處理? – nnnnnn

回答

2

此代碼構思不佳,但我不認爲它是可利用的。

  • document.referrer.split('/')[2]提取引用者的主機名。攻擊者可能會控制主機名,但僅限於有限的程度;他們不能將任何內容放入無法註冊或設置爲域名的字段中。

  • branding[siteName]可以作出做一些有趣的事情,如果siteName是對對象的內部屬性的名稱,如__proto__或方法的名稱,如hasOwnProperty。但是,這些屬性都不能作爲Internet主機名有效,因爲它們中沒有任何一個屬於它們。 __proto__包含下劃線,它們甚至在主機名中都不是有效的!

  • 如果siteName不受約束,以下['color']仍限制此​​代碼。函數(如hasOwnProperty)不會有color屬性;對象原型也不會,所以這看起來像死衚衕。

  • 即使我們假設像函數一個奇怪的值莫名其妙鑽進結果,分配那樣的價值.style.color不會做任何事情奇怪。

的漏洞的潛力是很容易避免,但:

var siteName = document.referrer.split('/')[2]; 

if (branding.hasOwnProperty(siteName)) { 
    ... everything else ... 
} 

Object.hasOwnProperty是方法的名字和相同__proto__「怪異」的屬性虛假的;只有在對象上顯式聲明的屬性纔是真實的。這會將以下代碼限制爲僅針對預期的站點名稱運行。

+0

我不知道'.hasOwnProperty()'。這是否需要「品牌」的構造方式不同?據我瞭解,「品牌」是一個關聯數組,而不是一個對象。 –

+0

不,不需要其他更改。 Javascript對象_are_關聯數組 - 「{...}」定義一個對象。 – duskwuff