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

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

如何檢查 SecurityManager 中的調(diào)用者類來源?

如何檢查 SecurityManager 中的調(diào)用者類來源?

不負(fù)相思意 2023-06-14 14:35:26
我有一個(gè)用于受信任的應(yīng)用程序代碼的 ClassLoader 和一個(gè)用于用戶提交的(不受信任的)代碼的單獨(dú)的 ClassLoader。我希望安全管理器限制用戶提交的代碼。如何從 SecurityManager 中檢查調(diào)用方來源?查看偽代碼:System.setSecurityManager(new SecurityManager() {    public void checkPermission(Permission permission) {        if (/*caller class is not loaded by the trusted classloader*/) {            throw new SecurityException("You do not have permissions.");        }    }});我已經(jīng)嘗試過的:StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass().getClassLoader()首先檢查權(quán)限,以便它給出堆棧溢出異常。Thread.currentThread().getStackTrace()[2].getClassLoaderName()是不安全的,因?yàn)樗惶峁╊惣虞d器名稱而不是類對(duì)象,如果不受信任的加載器的規(guī)范名稱與受信任的加載器相同,那么這是一個(gè)安全問題。
查看完整描述

2 回答

?
慕姐8265434

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

首先,SecurityManager 有一個(gè)受保護(hù)的方法getClassContext()。
您的代碼如下所示:

System.setSecurityManager(new SecurityManager() {

? ? public void checkPermission(Permission permission) {

? ? ? ? Class<?> caller = getClassContext()[1];

? ? ? ? ClassLoader ccl = caller.getClassLoader();

? ? ? ? if (ccl != null || ccl != getClass().getClassLoader()) {

? ? ? ? ? ? throw new SecurityException("You do not have permissions.");

? ? ? ? }

? ? }

});

其次,如果要使用 a StackWalker,建議您復(fù)用StackWalker實(shí)例:


StackWalker walker = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);

System.setSecurityManager(new SecurityManager() {

? ? public void checkPermission(Permission permission) {

? ? ? ? Class<?> caller = walker.getCallerClass();

? ? ? ? ClassLoader ccl = caller.getClassLoader();

? ? ? ? if (ccl != null || ccl != getClass().getClassLoader()) {

? ? ? ? ? ? throw new SecurityException("You do not have permissions.");

? ? ? ? }

? ? }

});

第三,這很可能不會(huì)做你想做的。安全檢查在整個(gè) JDK 中完成,因此調(diào)用者可能在任意數(shù)量的堆棧級(jí)別之外,需要您檢查整個(gè)堆棧(提示:在您第二次訪問堆棧中的 SecurityManager 時(shí)中斷)。


相反,定義一個(gè)策略(創(chuàng)建一個(gè) java 策略文件),您可以在其中授予您的代碼所有權(quán)限并使用 java.lang.SecurityManager。


如果無法編寫您自己的策略文件,您也可以使用Policy.setPolicy()安裝您自己的java.security.Policy.


一些實(shí)現(xiàn) a 的提示java.security.Policy:

  • 覆蓋implies和兩種getPermissions方法。嚴(yán)重地。

  • 趕上你自己ProtectionDomain的政策類。(?private static final ProtectionDomain MY_PD = MyPolicy.class.getProtectionDomain())

  • 如果檢查是針對(duì)您自己的 ProtectionDomain,請(qǐng)使用快速路徑。


查看完整回答
反對(duì) 回復(fù) 2023-06-14
?
慕后森

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

我找到了一個(gè)臨時(shí)解決方案,但它并不完美:


System.setSecurityManager(new SecurityManager() {

    public void checkPermission(Permission permission) {

        Class<?> caller = SecurityManager.class;

        Class<?>[] classContext = this.getClassContext();

        int loopAmount = 0;


        while (caller.getCanonicalName() == null

                 || !caller.getCanonicalName().startsWith("nl")) {

            caller = classContext[loopAmount];

            loopAmount++;

        }


        if (caller.getClassLoader() != trustedClassLoader) {

            throw new SecurityException("You do not have permissions.");

        }

    }

});

所有不受信任的類的規(guī)范名稱都必須以“nl”開頭。這是 afaik 從類上下文中獲取調(diào)用者類的唯一方法,因?yàn)檎{(diào)用者類的數(shù)組位置未知,上下文數(shù)組的最后一個(gè)元素始終是具有 main 方法的類。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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