第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何將setAccessible限制為僅“合法”使用?

如何將setAccessible限制為僅“合法”使用?

慕少森 2019-11-06 10:54:00
我對(duì)的力量了解得越多,我java.lang.reflect.AccessibleObject.setAccessible就越驚訝于它的作用。這是根據(jù)我對(duì)問題的回答(使用反射更改靜態(tài)最終File.separatorChar用于單元測(cè)試)改編而成的。import java.lang.reflect.*;public class EverythingIsTrue {   static void setFinalStatic(Field field, Object newValue) throws Exception {      field.setAccessible(true);      Field modifiersField = Field.class.getDeclaredField("modifiers");      modifiersField.setAccessible(true);      modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);      field.set(null, newValue);   }   public static void main(String args[]) throws Exception {            setFinalStatic(Boolean.class.getField("FALSE"), true);      System.out.format("Everything is %s", false); // "Everything is true"   }}您可以做真正令人發(fā)指的事情:public class UltimateAnswerToEverything {   static Integer[] ultimateAnswer() {      Integer[] ret = new Integer[256];      java.util.Arrays.fill(ret, 42);      return ret;   }      public static void main(String args[]) throws Exception {      EverythingIsTrue.setFinalStatic(         Class.forName("java.lang.Integer$IntegerCache")            .getDeclaredField("cache"),         ultimateAnswer()      );      System.out.format("6 * 9 = %d", 6 * 9); // "6 * 9 = 42"   }}大概是API設(shè)計(jì)者意識(shí)到了可濫用性setAccessible,但是必須承認(rèn)它具有合法的用途來提供它。所以我的問題是:真正合法的用途是setAccessible什么?Java是否可以被設(shè)計(jì)為一開始就沒有這種需求?這種設(shè)計(jì)的負(fù)面后果(如果有)是什么?您setAccessible只能限制合法使用嗎?只有通過SecurityManager嗎?它是如何工作的?白名單/黑名單,粒度等?必須在您的應(yīng)用程序中對(duì)其進(jìn)行配置是否常見?setAccessible無論SecurityManager配置如何,我都可以將自己的類寫成-proof 嗎?還是由誰來管理配置?我猜一個(gè)更重要的問題是:我需要為此擔(dān)心嗎???我的課程都沒有任何類似的可執(zhí)行隱私?,F(xiàn)在無法執(zhí)行單例模式(不考慮其優(yōu)缺點(diǎn))。正如我上面的摘錄所示,甚至幾乎無法保證有關(guān)Java基礎(chǔ)如何工作的一些基本假設(shè)。這些問題不是真的嗎???好的,我剛剛確認(rèn):感謝setAccessible,Java字符串不是不可變的。import java.lang.reflect.*;public class MutableStrings {   static void mutate(String s) throws Exception {      Field value = String.class.getDeclaredField("value");      value.setAccessible(true);      value.set(s, s.toUpperCase().toCharArray());   }    我是唯一認(rèn)為這是一個(gè)巨大問題的人嗎?
查看完整描述

3 回答

?
SMILET

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊

真正合法的用途是setAccessible什么?

單元測(cè)試,JVM內(nèi)部(例如,實(shí)現(xiàn)System.setError(...))等等。


Java是否可以被設(shè)計(jì)為一開始就沒有這種需求?

這種設(shè)計(jì)的負(fù)面后果(如果有)是什么?

很多事情將無法實(shí)現(xiàn)。例如,各種Java持久性,序列化和依賴項(xiàng)注入都依賴于反射。幾乎所有在運(yùn)行時(shí)都依賴JavaBeans約定的東西。


您setAccessible只能限制合法使用嗎?

只有通過SecurityManager嗎?

是。


它是如何工作的?白名單/黑名單,粒度等?

這取決于權(quán)限,但我相信使用權(quán)限setAccessible是二進(jìn)制的。如果需要粒度,則需要對(duì)要限制的類使用其他類加載器和其他安全管理器。我猜您可以實(shí)現(xiàn)一個(gè)實(shí)現(xiàn)更細(xì)粒度邏輯的自定義安全管理器。


必須在您的應(yīng)用程序中對(duì)其進(jìn)行配置是否常見?

沒有。


setAccessible無論SecurityManager配置如何,我都可以將自己的類寫成-proof 嗎?

還是由誰來管理配置?

不,你不能,是的。


另一種選擇是通過源代碼分析工具“強(qiáng)制”執(zhí)行此操作。例如風(fēng)俗pmd或findbugs規(guī)則?;颍ɡ纾┳R(shí)別的代碼的選擇性代碼審查grep setAccessible ...。


作為對(duì)后續(xù)行動(dòng)的回應(yīng)


我的課程都沒有任何類似的可執(zhí)行隱私?,F(xiàn)在無法執(zhí)行單例模式(不考慮其優(yōu)缺點(diǎn))。


如果那讓您擔(dān)心,那么我想您需要擔(dān)心。但是,實(shí)際上,您不應(yīng)該試圖迫使其他程序員尊重您的設(shè)計(jì)決策。如果人們愚蠢到可以使用反射無意中創(chuàng)建多個(gè)單例實(shí)例(例如),那么他們可以承受后果。


另一方面,如果您的意思是“隱私”包含保護(hù)敏感信息不被泄露的含義,那么您就是在樹錯(cuò)誤的樹。在Java應(yīng)用程序中保護(hù)敏感數(shù)據(jù)的方法是不允許不信任的代碼進(jìn)入處理敏感數(shù)據(jù)的安全沙箱中。Java訪問修飾符并非旨在成為一種安全機(jī)制。


<字符串示例>-我是唯一認(rèn)為這是一個(gè)巨大問題的人嗎?


可能不是唯一的一個(gè):-)。但是海事組織,這不是一個(gè)問題。公認(rèn)的事實(shí)是,不應(yīng)在沙箱中執(zhí)行不受信任的代碼。如果您擁有受信任的代碼/受信任的程序員從事此類工作,那么您的問題就會(huì)比意外地可變的字符串更糟糕。(想想邏輯炸彈,通過秘密渠道泄露數(shù)據(jù)等)


在您的開發(fā)或運(yùn)營團(tuán)隊(duì)中,有許多方法可以解決(或減輕)“不良行為者”的問題。但是它們是昂貴且限制性的...對(duì)于大多數(shù)用例來說是過大的。


查看完整回答
反對(duì) 回復(fù) 2019-11-06
?
慕的地10843

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊

在這種情況下,反射確實(shí)與安全/保障正交。


我們?nèi)绾蜗拗品瓷洌?/p>


Java具有安全管理器,并且ClassLoader是其安全模型的基礎(chǔ)。就您而言,我想您需要看看java.lang.reflect.ReflectPermission。


但這并不能完全解決反射問題。可用的反射功能應(yīng)遵循細(xì)粒度的授權(quán)方案,而現(xiàn)在情況并非如此。例如,允許某些框架使用反射(例如Hibernate),但不使用其余代碼。或者為了調(diào)試目的而允許程序僅以只讀方式反映。


將來可能成為主流的一種方法是使用所謂的鏡子將反射功能與類分開。請(qǐng)參閱《鏡像:元級(jí)設(shè)施的設(shè)計(jì)原則》。但是,還有其他各種研究可以解決這個(gè)問題。但是我同意動(dòng)態(tài)語言的問題比靜態(tài)語言更為嚴(yán)重。


我們應(yīng)該擔(dān)心反射給我們帶來的超級(jí)大國嗎?是的,沒有。


是的,因?yàn)镴ava平臺(tái)應(yīng)該由Classloader安全管理器保護(hù)。破壞反射的能力可以看作是一種突破。


沒有在這個(gè)意義上,大多數(shù)系統(tǒng)都是反正不是完全安全的。很多類經(jīng)??梢员蛔宇惢?,您可能已經(jīng)就這樣濫用了系統(tǒng)。當(dāng)然類可以制成final或密封,使他們不能在其他罐子被繼承。但是據(jù)此,只有少數(shù)幾個(gè)類得到正確保護(hù)(例如String)。


有關(guān)最終課程的詳細(xì)信息,請(qǐng)參見此答案。另請(qǐng)參閱Sami Koivu的博客,以獲取有關(guān)安全性的更多Java 技巧。


Java的安全性模型在某些方面可以視為不足。諸如NewSpeak之類的某些語言甚至采用了更為激進(jìn)的模塊化方法,在這種方法中,您只能訪問依賴關(guān)系反轉(zhuǎn)顯式提供給您的內(nèi)容(默認(rèn)情況下為無)。


同樣重要的是要注意,安全性始終是相對(duì)的。在語言級(jí)別,例如,您不能阻止模塊形式消耗100%的CPU或消耗所有內(nèi)存,直到一個(gè)OutOfMemoryException。這些問題需要通過其他方式解決。將來我們可能會(huì)看到Java擴(kuò)展了資源利用率配額,但是明天就不行了:)


我可以在這個(gè)問題上做更多的擴(kuò)展,但是我認(rèn)為我已經(jīng)指出了。


查看完整回答
反對(duì) 回復(fù) 2019-11-06
  • 3 回答
  • 0 關(guān)注
  • 1037 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)