例如,如果我要製作一個程序,該程序將輸入的排序算法作爲輸入並根據經驗確定算法是否部分正確,那麼如何將字符串輸入轉換爲可執行程序?我已經閱讀了其他建議使用exec或eval的線程,但是由於安全風險,所有的答案都建議不要使用這種方法。有沒有辦法創建這樣的程序,不涉及將字符串轉換爲可執行代碼?或者無論實施如何,它本身就會是一個危險的程序?最後,是否有另一種編程語言可以成爲定義這樣一個程序的更好選擇?如何在Python中安全地操作用戶代碼?
回答
執行任意代碼
無論你選擇什麼樣的語言,如果你從用戶讀取代碼並執行該代碼,這將是危險的。沒有ifs,ands或buts。您注意到Python的exec和eval的注意事項也注意到Javascript,PHP和許多其他語言。
安全地從一個字符串
有安全的方法來映射字符串預定義功能執行代碼,但沒有安全編譯/解釋和執行任意代碼的方式。
一個很好的例子是關於安全功能映射到一個字符串如下:
functions = {
'print': print,
'str': str,
'int': int
}
name = input('Choose from the above functions here')
functions.get(name)()
靜態代碼分析
和最終的答案,可能,但沒有,因爲會成爲評估排序算法的方法,但它們不可能是有效的,可重複的或準確的,無需編譯代碼或至少解釋它。靜態代碼分析是困難的,只能走得這麼遠。
如何困難,如果語句是下面的靜態代碼分析可以用一個甚至一個簡單的例子:
for index, value in enumerate(range(10)):
if index and value - old == 1:
print(value)
old = value
那些靜態代碼分析認爲這段代碼會產生一個錯誤(如pylint的一些圖書館例如),因爲old
是在第一次使用後定義的,但是,由於bool(0)
將評估爲False,實際上只有在第一個循環之後進行檢查,在已經定義之後纔會檢查,因此代碼運行時沒有問題。
想想輸入的複雜性,輸出的複雜性以及可能的排序算法的變體數量,這些算法都是等價的。測試代碼最簡單的方法就是運行它。動態代碼分析存在侷限性,但是對於給定的輸入,然後將其與所需的輸出進行比較,如果代碼能夠正常工作,則可以獲得一個好主意,而這僅僅是靜態分析非常困難的。
我認爲你的意思是'和'如果索引或舊的值== 1:',因爲0是假的,假的或x == x的所有x – Copperfield
@Copperfield,謝謝。我做到了。還有另一個錯字。謝謝。 –
- 1. 如何安全地「評估」網頁中的用戶代碼?
- 2. 如何安全地在網站上運行用戶代碼?
- 3. 如何安全地執行用戶提交的PHP代碼
- 4. 如何安全地讓用戶運行任意的Ruby代碼?
- 5. 網站如何安全地託管和執行用戶代碼
- 6. 如何安全地將用戶密碼存儲在Cloudant DB中?
- 7. 如何在安全比賽中使用不安全的代碼?
- 8. 如何在Java中線程安全地操作列表?
- 9. 如何在Java中安全地操作文件線程?
- 10. 如何在Python中安全地存儲數據庫密碼?
- 11. 如何安全地保存用戶名/密碼(本地)?
- 12. 如何在瀏覽器內安全地運行用戶提供的Javascript代碼?
- 13. 如何安全地在mySQL數據庫中插入代碼
- 14. 如何安全地在Node.js中執行未知的Javascript代碼?
- 15. 用戶代碼可以安全地使用struct padding嗎?
- 16. 如何安全地從用戶link_to點擊運行模型操作?
- 17. putpecialobject如何在RubyVM中操作代碼?
- 18. 如何在我的Python代碼中建立操作順序?
- 19. 安全地存儲用戶聯盟代碼
- 20. 安全地在客戶端執行代碼
- 21. 安全地共享操作系統'
- 22. 如何安全地允許用戶提交代碼以定期運行?
- 23. 如何安全地確定用戶在使用客戶會話
- 24. 如何使用重構工具安全地重構代碼?
- 25. 如何獲取安全代碼發送到用戶設備
- 26. 如何使用戶輸入的C#代碼安全?
- 27. 如何在我的代碼安全實現的url安全嗎?
- 28. 在我的代碼中使用python單詞「type」安全嗎?
- 29. 如何在Python中安全地使用exec()?
- 30. 如何在開源軟件中安全地存儲用戶的密碼?
所以你的問題是「如何將字符串轉換爲可執行程序而不將字符串轉換爲可執行程序」? –
沒有我的問題是「我可以寫一個程序,作爲輸入的排序算法,並根據經驗確定算法是否部分正確無需將字符串轉換爲可執行程序?」。 –
然後你可能想要改變標題。 –