開場白:我知道很多人已經嘗試過沙Python代碼中Python和失敗了,但我還沒有見過的方式來額外預處理作爲文本的腳本和包含關鍵字的拒絕腳本,如__base__
可用於恢復隱藏的__buuiltins__
。我認爲這種方法是新的,並且尚未證明失敗 - 是嗎?運行不可信的Python代碼,它能夠與主程序進行溝通,但是從系統中隔離
我打算編寫一個多人戰略遊戲,玩家可能通常不會使用鍵盤/鼠標命令與其單位交互,但只能通過他們必須提交的腳本來更改單位的自動行爲。這是基於http://screeps.com的想法。
我很想寫在Python 3,但主要的問題似乎是在服務器上不受信任的外籍球員腳本的安全執行。我知道,我可能不信任exec()
或eval()
,將它們空globals
和locals
的環境也是如此。我也知道,只是擦除__builtins__
也不起作用,因爲一個仍然可以很輕鬆地使用Python的自省能力,這裏描述的恢復:http://nedbatchelder.com/blog/201302/finding_python_3_builtins.html
我已經瞭解到,PyPy和Jython中可能有某種沙盒功能,將可能是工作我的目的,但我會不知何故喜歡留在CPython參考解釋器。另外,我只能找到那些沙箱功能適用於整個程序的示例,但沒有一個包含主程序,它們將不受信任的腳本作爲子線程運行並與其進行有效通信。
但是我想我有更多的機會:我可以預處理提交腳本字面上搜索像__class__
或__base__
串並拒絕包含這些關鍵字的腳本。我還必須用我自己的安全功能替換腳本中的eval()
和exec()
,這些功能也拒絕運行包含這些關鍵字的代碼。
如果使用exec()
的自定義globals
參數來覆蓋所有潛在的危險項目(哪一個會是?),這種方法是否安全?我必須尋找哪些關鍵字?
如果沒有,爲什麼會失敗?你能提出更好的解決方案嗎?
引用您應該閱讀其他SO質疑[我怎麼能沙箱的Python在純Python?](http://stackoverflow.com/q/3068139)(這似乎是重複的,但另一個現在是相當老...),也許[Python沙箱](https:// pypi .python.org/pypi/pysandbox /)但是它似乎只支持2.x –
@SergeBallesta謝謝,這個問題很好,但它的答案並不是我想要的,但那些提到'exec'的安全性太低了,那些提到其他口譯員的人也不太適合我想要的東西。PyPy也一樣 –