2013-08-24 29 views
1

我目前正在評估一個項目的可行性,以構建一個小型Web應用程序,該應用程序提供了一個類似於tryrubycodeacademy的REPL編程環境,並一直在研究可能的解決方案以評估用戶提交的代碼安全,關於服務器端解決方案我已經讀過JVM提供了最好的沙盒環境,因爲它內置了security measures用於運行多個JVM平臺語言的Java沙箱

我讀了JavaTM Scripting API,它可以用來評估various script engines/ interpreters上的代碼,比如rhino(javascript),jruby,jython和Quercus(php)。運行JVM的單個服務器可以用不同的語言來評估用戶代碼嗎?這是否有效?如果不是我有什麼其他選擇?

回答

1

運行JVM的單個服務器可以用不同的語言來評估用戶代碼嗎?

是的,這是可行的。

這樣做效率高嗎?

我不確定爲什麼效率是一個特別的問題。它讓我想到爲遠程用戶運行小例子並不需要效率。無論哪種方式,我認爲它應該是足夠高效


然而,這裏真正令人擔憂的是,這樣的服務誠邀各種虐待:

  • 的人可能會傾向於嘗試和突破沙箱。如果你沒有正確實施它(或者他們可以利用一些未經修補的安全缺陷),他們可能會成功,並進入系統的其他部分。

  • 人們可能傾向於發起拒絕服務攻擊。安全沙箱不能處理各種各樣的事情;例如創建大型數據結構來觸發GC重載和OOME,創建大量線程和無限循環。

  • 或者他們可能會偶然做一些上述事情。

如果您實施的服務類似於您提議的服務,則需要採取策略來處理這些問題。


隨訪

關於對效率的評論,我的想法是,加載一個完整的解釋到內存中的代碼可能是單行線,可以不採取最好的方法?

那麼在基於JVM的語言上實現服務的正常方式是在同一個JVM實例中運行多個請求。如果你這樣做了,你不會每次都加載解釋器。你只是重新初始化它。

但無論哪種方式,您最好將效率問題留待日後處理。

+0

Hi @StephenC感謝您的回覆,我確實必須考慮您提到的問題,這些都非常有幫助。關於效率的評論,我的想法是,將一個完整的解釋器加載到內存中可能只是一行代碼,可能不是最好的方法? –