RMI羅唆得太多了,實(shí)在是盡力想把它說(shuō)清楚,希望對(duì)大家有幫助。最后的最后,給大家簡(jiǎn)單講一下JVM框架,我們叫做Java沙箱。Java沙箱的基本組件如下:
a) 類裝載器結(jié)構(gòu)
b) class文件檢驗(yàn)器
c) 內(nèi)置于Java虛擬機(jī)的安全特性
d) 安全管理器及Java API
其中類裝載器在3個(gè)方面對(duì)Java沙箱起作用:
a. 它防止惡意代碼去干涉善意的代碼
b. 它守護(hù)了被信任的類庫(kù)邊界
c. 它將代碼歸入保護(hù)域,確定了代碼可以進(jìn)行哪些操作
虛擬機(jī)為不同的類加載器載入的類提供不同的命名空間,命名空間由一系列唯一的名稱組成,每一個(gè)被裝載的類將有一個(gè)名字,這個(gè)命名空間是由Java虛擬機(jī)為每一個(gè)類裝載器維護(hù)的,它們互相之間甚至不可見(jiàn)。
我們常說(shuō)的包(package)是在Java虛擬機(jī)第2版的規(guī)范第一次出現(xiàn),正確定義是由同一個(gè)類裝載器裝載的、屬于同一個(gè)包、多個(gè)類型的集合。類裝載器采用的機(jī)制是雙親委派模式。具體的加載器框架我在Java雜談(一)中已經(jīng)解釋過(guò)了,當(dāng)時(shí)說(shuō)最外層的加載器是AppClassLoader,其實(shí)算上網(wǎng)絡(luò)層的話AppClassLoader也可以作為parent,還有更外層的加載器URLClassLoader。為了防止惡意攻擊由URL加載進(jìn)來(lái)的類文件我們當(dāng)然需要分不同的訪問(wèn)命名空間,并且制定最安全的加載次序,簡(jiǎn)單來(lái)說(shuō)就是兩點(diǎn):
a. 從最內(nèi)層JVM自帶類加載器開(kāi)始加載,外層惡意同名類得不到先加載而無(wú)法使用
b. 由于嚴(yán)格通過(guò)包來(lái)區(qū)分了訪問(wèn)域,外層惡意的類通過(guò)內(nèi)置代碼也無(wú)法獲得權(quán)限訪問(wèn)到內(nèi)層類,破壞代碼就自然無(wú)法生效。
附:關(guān)于Java的平臺(tái)無(wú)關(guān)性,有一個(gè)例子可以很明顯的說(shuō)明這個(gè)特性:
一般來(lái)說(shuō),C或C++中的int占位寬度是根據(jù)目標(biāo)平臺(tái)的字長(zhǎng)來(lái)決定的,這就意味著針對(duì)不同的平臺(tái)編譯同一個(gè)C++程序在運(yùn)行時(shí)會(huì)有不同的行為。然而對(duì)于 Java中的int都是32位的二進(jìn)制補(bǔ)碼標(biāo)識(shí)的有符號(hào)整數(shù),而float都是遵守IEEE 754浮點(diǎn)標(biāo)準(zhǔn)的32位浮點(diǎn)數(shù)。
PS: 這個(gè)小弟最近也沒(méi)時(shí)間繼續(xù)研究下去了,只是想拋磚引玉的提供給大家一個(gè)初步認(rèn)識(shí)JVM的印象。有機(jī)會(huì)了解一下JVM的內(nèi)部結(jié)構(gòu)對(duì)今后做Java開(kāi)發(fā)是很有好處的。
a) 類裝載器結(jié)構(gòu)
b) class文件檢驗(yàn)器
c) 內(nèi)置于Java虛擬機(jī)的安全特性
d) 安全管理器及Java API
其中類裝載器在3個(gè)方面對(duì)Java沙箱起作用:
a. 它防止惡意代碼去干涉善意的代碼
b. 它守護(hù)了被信任的類庫(kù)邊界
c. 它將代碼歸入保護(hù)域,確定了代碼可以進(jìn)行哪些操作
虛擬機(jī)為不同的類加載器載入的類提供不同的命名空間,命名空間由一系列唯一的名稱組成,每一個(gè)被裝載的類將有一個(gè)名字,這個(gè)命名空間是由Java虛擬機(jī)為每一個(gè)類裝載器維護(hù)的,它們互相之間甚至不可見(jiàn)。
我們常說(shuō)的包(package)是在Java虛擬機(jī)第2版的規(guī)范第一次出現(xiàn),正確定義是由同一個(gè)類裝載器裝載的、屬于同一個(gè)包、多個(gè)類型的集合。類裝載器采用的機(jī)制是雙親委派模式。具體的加載器框架我在Java雜談(一)中已經(jīng)解釋過(guò)了,當(dāng)時(shí)說(shuō)最外層的加載器是AppClassLoader,其實(shí)算上網(wǎng)絡(luò)層的話AppClassLoader也可以作為parent,還有更外層的加載器URLClassLoader。為了防止惡意攻擊由URL加載進(jìn)來(lái)的類文件我們當(dāng)然需要分不同的訪問(wèn)命名空間,并且制定最安全的加載次序,簡(jiǎn)單來(lái)說(shuō)就是兩點(diǎn):
a. 從最內(nèi)層JVM自帶類加載器開(kāi)始加載,外層惡意同名類得不到先加載而無(wú)法使用
b. 由于嚴(yán)格通過(guò)包來(lái)區(qū)分了訪問(wèn)域,外層惡意的類通過(guò)內(nèi)置代碼也無(wú)法獲得權(quán)限訪問(wèn)到內(nèi)層類,破壞代碼就自然無(wú)法生效。
附:關(guān)于Java的平臺(tái)無(wú)關(guān)性,有一個(gè)例子可以很明顯的說(shuō)明這個(gè)特性:
一般來(lái)說(shuō),C或C++中的int占位寬度是根據(jù)目標(biāo)平臺(tái)的字長(zhǎng)來(lái)決定的,這就意味著針對(duì)不同的平臺(tái)編譯同一個(gè)C++程序在運(yùn)行時(shí)會(huì)有不同的行為。然而對(duì)于 Java中的int都是32位的二進(jìn)制補(bǔ)碼標(biāo)識(shí)的有符號(hào)整數(shù),而float都是遵守IEEE 754浮點(diǎn)標(biāo)準(zhǔn)的32位浮點(diǎn)數(shù)。
PS: 這個(gè)小弟最近也沒(méi)時(shí)間繼續(xù)研究下去了,只是想拋磚引玉的提供給大家一個(gè)初步認(rèn)識(shí)JVM的印象。有機(jī)會(huì)了解一下JVM的內(nèi)部結(jié)構(gòu)對(duì)今后做Java開(kāi)發(fā)是很有好處的。