2016-02-29 16 views
7

開場白:我知道很多人已經嘗試過沙Python代碼中Python和失敗了,但我還沒有見過的方式來額外預處理作爲文本的腳本和包含關鍵字的拒絕腳本,如__base__可用於恢復隱藏的__buuiltins__。我認爲這種方法是新的,並且尚未證明失敗 - 是嗎?運行不可信的Python代碼,它能夠與主程序進行溝通,但是從系統中隔離

我打算編寫一個多人戰略遊戲,玩家可能通常不會使用鍵盤/鼠標命令與其單位交互,但只能通過他們必須提交的腳本來更改單位的自動行爲。這是基於http://screeps.com的想法。

我很想寫在Python 3,但主要的問題似乎是在服務器上不受信任的外籍球員腳本的安全執行。我知道,我可能不信任exec()eval(),將它們空globalslocals的環境也是如此。我也知道,只是擦除__builtins__也不起作用,因爲一個仍然可以很輕鬆地使用Python的自省能力,這裏描述的恢復:http://nedbatchelder.com/blog/201302/finding_python_3_builtins.html

我已經瞭解到,PyPy和Jython中可能有某種沙盒功能,將可能是工作我的目的,但我會不知何故喜歡留在CPython參考解釋器。另外,我只能找到那些沙箱功能適用於整個程序的示例,但沒有一個包含主程序,它們將不受信任的腳本作爲子線程運行並與其進行有效通信。


但是我想我有更多的機會:我可以預處理提交腳本字面上搜索像__class____base__串並拒絕包含這些關鍵字的腳本。我還必須用我自己的安全功能替換腳本中的eval()exec(),這些功能也拒絕運行包含這些關鍵字的代碼。

如果使用exec()的自定義globals參數來覆蓋所有潛在的危險項目(哪一個會是?),這種方法是否安全?我必須尋找哪些關鍵字?

如果沒有,爲什麼會失敗?你能提出更好的解決方案嗎?

+0

引用您應該閱讀其他SO質疑[我怎麼能沙箱的Python在純Python?](http://stackoverflow.com/q/3068139)(這似乎是重複的,但另一個現在是相當老...),也許[Python沙箱](https:// pypi .python.org/pypi/pysandbox /)但是它似乎只支持2.x –

+0

@SergeBallesta謝謝,這個問題很好,但它的答案並不是我想要的,但那些提到'exec'的安全性太低了,那些提到其他口譯員的人也不太適合我想要的東西。PyPy也一樣 –

回答

1

我不知道,這是一個好主意。有可能使用pypy,或者甚至已經處理了很多系統隔離的專用項目python sandbox。但前者需要一個很好的協議工作,以建立一個安全的環境,而後者不直接支持Python 3.x都有

但pysandbox的作者已經停止開發自2013年起,因爲他在其github site

聲明

pysandbox壞BY DESIGN,請移動到一個新的沙盒解決方案(在沙箱中,而不是相反運行python!)https://lwn.net/Articles/574215/ *

如果你能接受一個有限的語法,這肯定會非常非常多安全地定義專用語法並構建自定義口譯員PythonLexYacc

我必須承認這是不是一個完整的答案更多的提示,但它是最好的,我現在可以做(和Python沙盒是不是that former SO question

+0

pysandbox被作者強烈阻止發現漏洞:https://lwn.net/Articles/574215/ –

+0

@ByteCommander:謝謝參考。我會嘗試更新我的答案以供將來參考,但它確認了我的第一個觀點,即構建一個安全的Python解釋器對於一個真正的問題是一個錯誤的解決方案:-( –

+0

但是,如果我理解正確,他們只會做他們的隔離通過使用Python方法限制腳本,我的方法是將原始腳本作爲文本進行預處理,並簡單地拒絕所有包含特殊關鍵字的腳本,比如'__base__',這個關鍵字通常用於分離並重新創建'__builtins__'。不同的方法,不是嗎?至少我在網絡上找不到任何東西 –

相關問題