2012-12-14 33 views
2

我在我的Java應用程序中使用JRuby來允許用戶運行腳本。該應用程序的正常功能所需的一組操作並不大。該腳本應該控制Java代碼中的一些變量,並在執行過程中更改該過程。是否可以在Java應用程序中限制允許的JRuby命令?

所以我想有機會限制允許的操作數。說,我不希望用戶有權訪問文件系統。

f = File.new("myfile.txt", "w") 
f.puts("Hello!") 
f.close 

這應該是禁止的。

我該如何做這樣的設置?我唯一的想法是在啓動之前解析用戶腳本,並將腳本與允許的操作的白名單進行比較。

回答

4

你應該做的是創造允許命令的白名單。如果發現腳本包含不在白名單中的命令,則需要拒絕整個腳本。 Andrew Thompson指出安全經理是一個很好的額外層,但這不是安全分層的結束。我不認爲在沙盒applet中運行真的會給你帶來太多的收益,因爲你仍然需要確定腳本是否有效。

白名單實例

一般來說,當你生成一個白名單有期權數量有限/命令你希望用戶能夠從其餘的成爲廢棄選擇。您會創建一些枚舉或最終數據結構(以最大限度地減少其在運行時由惡意程序修改的能力)。如果你想用戶只需要調用你的函數foo,而不是bar你可以寫這樣的事情,這是完全原始的選項,但說明了這一概念:

class WhiteList 
{ 
    allowedCommands = ["foo"]; 
} 

,並在你的主是這樣的:

class Main 
{ 
    for(Command command in userInput) 
    { 
      if(command not in allowedCommands) 
      { 
       log security message; 
       continue/break 
      } 
    } 
} 
+0

標準'SecurityManager'可能不夠(例如,尤其是對於資源使用 - 如果客戶端腳本將JRE發送到無限循環?)。這種額外的預防措施很有意義。 –

+0

白名單的想法非常棒!您能否給我提供一些提示或網址,在這種情況下,「白名單」的含義是什麼?它可以通過JRuby的支持功能來完成,還是我應該在解析腳本作爲文本時自己實現它?我找到了一個黑麥白名單的例子。對於JRuby來說,這會很有幫助(https://github.com/delano/rye/blob/master/lib/rye/cmd.rb)謝謝! – Anton

+1

@Anton我更新了一個原始的例子。 – Woot4Moo

1

安裝一個SecurityManager 爲用戶代碼。或者更容易,運行沙盒applet或JWS啓動的應用程序中的代碼。

  1. 安全管理器是一個類,允許應用程序實現安全策略。它允許應用程序在執行可能不安全或敏感的操作之前確定操作是什麼以及是否在允許執行操作的安全上下文中嘗試該操作。該應用程序可以允許或禁止該操作。

相關問題