動態(tài)JavaScript所造成一些你不知道的危害
動態(tài)JavaScript
JavaScript代碼很多時候會通過服務器端的帶啊名來動態(tài)地組合到一起。在這個組合的過程中,與用戶相關(guān)的信息會保存到這些JavaScript的代碼中。當將這個JavaScript腳本傳送到瀏覽端的時候,客戶端的JavaScript會立即投入使用。但是實際情況是,這些腳本很有可能會被第三方的所引入,而引入這些腳本是沒有同源策略的限制的。因此,一個被攻擊者所控制的網(wǎng)頁很有可能同樣被包含引入動態(tài)生成的JavaScript腳本然后觀察這個腳本的執(zhí)行情況以及可能存在的安全的問題。由于通過src方式導入的所有的JavaScript腳本和本地的腳本都是會共享全局變量的。因而,如果這樣的一個動態(tài)腳本包含了用戶的隱私數(shù)據(jù),那么攻擊者就通過引入這個腳本的方式就能夠訪問到這些數(shù)據(jù)。這種方式也被稱之為跨站腳本包含(XSSI)。
JavaScript的語言特性
在動態(tài)Javacript的危害中主要是涉及到JavaScript的作用域、原型鏈繼承這2個特性。
作用域的問題
JavaScript作用域的問題相信很多人都有所了解,不了解可以通過網(wǎng)上搜索看看。不像Java、C++這樣的語言是存在塊級作用域的,JavaScript僅僅是存在函數(shù)作用域。這就意味著JavaScript引擎會為每一個函數(shù)分配一個作用域。在函數(shù)內(nèi)部中定義的變量所在的作用域就是在函數(shù)內(nèi),這種作用域就叫做本地作用域。下面的代碼就很清楚地說明了全局作用域與本地作用域的區(qū)別。
原型鏈
在JavaScript中,每個創(chuàng)建的函數(shù)都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。在JavaScript中主要是通過原型鏈的方式作為繼承的主要方法。其基本思想是利用原型讓一個應用類型繼承另一個應用類型的屬性和方法。當訪問一個對象的屬性的時候,JavaScript就去判斷當前這個對象本身是否含有這個屬性,如果不存在就在對象的原型屬性中尋找。
攻擊方式
由于HTM中的script標簽不受同源策略的影響。因而腳本資源能夠?qū)氲娇缬虻捻撁娈斨?。雖然跨域的頁面不能夠直接訪問到這些腳本的源代碼,但是導入這個腳本之后可以觀察這個腳本在頁面中的執(zhí)行情況。如果這樣的一個動態(tài)腳本包含有用戶的隱私數(shù)據(jù),那么這種方式就有可能泄漏用戶的數(shù)據(jù)。
基于全局變量的攻擊
當導入的JavaScrpit中創(chuàng)建了一個全局變量,這個全局變量也是可以被頁面中的JavaScript代碼所訪問的。因此如果一個動態(tài)腳本將用戶的隱私數(shù)據(jù)賦值給了一個全局變量,那么攻擊者就可以通過全局變量就可以訪問到這個數(shù)據(jù)了。
假設在正常的腳本leak.js中的JavaScript代碼如下:
(function() { window.secret = "345a8b7c9d8e34f5"; })();
可以看到,此腳本中將用戶的隱私數(shù)據(jù)賦值給了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>
當用戶訪問到了含有上面的惡意代碼的網(wǎng)站的時候,此網(wǎng)站就會通過window對象來獲取用戶數(shù)據(jù)然后發(fā)送給攻擊者。
重新定義全局API攻擊
由于JavaScript的動態(tài)性,導致很多的函數(shù)能夠被攻擊者重寫,即使是那些JavaScript內(nèi)置的函數(shù)。如果一個動態(tài)的JavaScript腳本通過一個系統(tǒng)中內(nèi)置函數(shù)來傳遞隱私數(shù)據(jù),那么攻擊者在這個函數(shù)調(diào)用之前通過重寫這個函數(shù),就可以獲取到用戶的隱私數(shù)據(jù)了。
假設在正常的腳本leak.js中的JavaScript的代碼如下:
(function() { var secret = "345a8b7c9d8e34f5"; JSON.stringify(secret); })();
可以發(fā)現(xiàn),在這個代碼中,調(diào)用了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()
方法已經(jīng)被攻擊者重寫了,所以當導入的leak.js的中的代碼執(zhí)行,調(diào)用JSON.stringify()
的方法的時候,實際上調(diào)用的是攻擊者所寫的方法。這樣用戶的信息就會被竊取了。
原型篡改
正如之前說過的一樣,javaScript是基于原型鏈的。當訪問對象的一個屬性的時候,JavaScript解釋器會通過原型鏈來進行尋找,直到找到這個屬性為止。在下面的這段代碼中,我們就會對這個問題有一個清晰的認識了。
假設在正常的腳本leak.js中的JavaScript的代碼如下:
(function(){ var arr = ["secret1","secret2","secret3"]; var x = arr.slice(); })();
從代碼中可以看到,在arr數(shù)組中存在了3個與用戶有關(guān)的隱私數(shù)據(jù)。然后arr實例調(diào)用了slice()
方法。很明顯這個方法是不存在的。因為arr實例本身沒有創(chuàng)建和聲明這個方法,同時在Array對象中也沒有這個方法。但是當出現(xiàn)一個這樣的情況的時候,程序并沒有報錯,只是說明這個slice
方法不存在而已。所以在這樣的情況下,可能程序員也并不知道他所創(chuàng)建的arr實例有調(diào)用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>
當用戶訪問到這個含有惡意代碼的網(wǎng)站的時候,導入的leak.js中的JavaScript要執(zhí)行slice
方法執(zhí)行的時候,就會調(diào)用攻擊者為Array添加的slice
方法,這樣敏感數(shù)據(jù)就會發(fā)送到攻擊者了。
防范
開發(fā)人員在進行網(wǎng)站開發(fā)的時候,最好是將代碼與數(shù)據(jù)分開。敏感和重要的數(shù)據(jù)應該保存在單獨的文件中,這樣這些文件就不會被瀏覽器當作JavaScript來執(zhí)行了。同時還需要為這些靜態(tài)資源設置訪問權(quán)限,只要在用戶登錄之后才可以訪問,在這種情況下攻擊者即使引入了這個靜態(tài)資源也無法訪問這個數(shù)據(jù)。
總結(jié)
以上就是關(guān)于動態(tài)JavaScript所造成危害的全部內(nèi)容了,希望這篇文章能對大家的學習或者工作帶來一定的幫助,如果有疑問大家可以留言交流。
- js form action動態(tài)修改方法
- js給onclick事件賦值,動態(tài)傳參數(shù)實例解說
- jquery getScript動態(tài)加載JS方法改進詳解
- 動態(tài)加載JS文件的三種方法
- JS動態(tài)添加option和刪除option(附實例代碼)
- javascript實現(xiàn)的動態(tài)添加表單元素input,button等(appendChild)
- js 動態(tài)添加標簽(新增一行,其實很簡單,就是幾個函數(shù)的應用)
- Js動態(tài)創(chuàng)建div
- JS函數(shù)實現(xiàn)動態(tài)添加CSS樣式表文件
- JS中動態(tài)添加事件(綁定事件)的代碼
相關(guān)文章
js+html5獲取用戶地理位置信息并在Google地圖上顯示的方法
這篇文章主要介紹了js+html5獲取用戶地理位置信息并在Google地圖上顯示的方法,涉及html5元素的操作技巧,需要的朋友可以參考下2015-06-06Javascript實現(xiàn)的類似Google的Div拖動效果代碼
Javascript實現(xiàn)的類似Google的Div拖動效果代碼,需要的朋友可以參考下。2011-08-08