2017-06-01 34 views
2

我目前工作的一個程序由用戶運行外部提供的代碼(假設這種情況下是合理的)。經過大量研究後,我發現大部分與此有關的安全性都可以通過SecurityManager來處理;然而,如果它耗時太長,並且意圖成爲惡意代碼,我正在努力尋找殺死外部代碼的方法。例如,如果外部的代碼看起來像:停止不可信的代碼,如果時間太長

while (true) { 
    try { 
     Thread.sleep(50); 
    } catch (InterruptedException e) { 
     // Oh well, keep running 
    } 
} 

這將永遠保持運行,並且Thread.interrupt()不會做任何事來阻止該線程。是否有另一種方法來阻止不會導致任何問題的流氓線程?我碰到的所有問題都是Thread.stop(),但似乎並不是所有與此相關的問題的選項。如果沒有,是否還有其他選項可用來以程序仍然能夠直接與它進行交互的方式運行此代碼?

+0

這個問題沒有任何意義。如果用戶可以運行惡意代碼(根本沒有),那麼就沒有安全間隔來等待嘗試並殺死它。小程序因某種原因死亡。你真的想在這裏完成什麼? –

+1

在應該監督它的可信代碼的同一個JVM中運行不可信的代碼是一個非常危險的想法。這是原因之一,但想想如果它只是分配內存,直到虛擬機與OOME崩潰,會發生什麼。 – biziclop

回答

0

殺了執行代碼的Java進程。

假設的GNU/Linux或MacOS的系統:通過訪問運行

ps -ax | grep java # identify the correct process 
kill $pid   # kill it 

你可以在Java中做到這一點:

Process p = Runtime.getRuntime().exec(new String[]{"bash","-c","cmd 1 goes here"}); 

編輯:

考慮,你也會有爲了編譯用戶提供的代碼,編譯它並在它自己的jvm中啓動它是有意義的。

此外執行在完全虛擬機的代碼將是理想的,因爲那麼代碼是沙箱和不能訪問主機。

+0

惡意代碼的過程是否與我原來的相同,本質上是強制程序自殺? – StaticShadow

+0

是的,但您也可以在jvm的另一個實例中啓動該進程 – redxef

0

我相信,有在Java中沒有辦法像你describing.If線程執行剛剛殺死一個線程,它只是設置一個標誌,它是給線程注意到它或中斷線程等待或睡眠模式,這將引發 InterruptedException的

的唯一方法是殺死其中線程正在運行的進程。

call System.exit(int)