[英]Is it possible to restrict access to globals for a block of code in python?
我希望程序的用戶能夠在不破壞程序的情況下在python中定義自定義腳本。 我正在看這樣的東西:
def call(script):
code = "access modification code" + script
exec(code)
在“訪問修改代碼”定義范圍的情況下,腳本只能對其實例化的變量進行訪問。 是否可以執行此操作或使用類似功能執行某項操作,例如使用自己的作用域創建一個新的python環境,然后從中接收輸出?
感謝您的時間 :)
澄清編輯 “我想防止主動攻擊和與用戶腳本外部的程序變量的意外交互(因此隱藏所有全局變量)。用戶腳本的大小應較小,並以文本形式輸入。用戶腳本的返回必須為立即,好像它是程序的本機。”
在這種情況下,您要避免兩個單獨的問題:
對於第一個問題, 您需要確保執行的python代碼的源是user 。 您不應接受來自套接字或其他用戶可以寫入的文件的輸入。 您需要以某種方式確保正在運行提供輸入的程序的用戶。 實際的解決方案將取決於您的OS,但如果要將代碼存儲在文件中,則可能需要考慮設置限制性文件權限。
不要忽略或輕視這個問題,否則由於您的程序,您的用戶將成為病毒/惡意軟件/黑客的受害者。
解決第二個問題的方式取決於程序中確切構成預期行為的內容。 如果您對輸出簡單的數據結構感到滿意,則可以在一個單獨的進程中運行用戶輸入的代碼 ,然后將結果以序列化格式(例如JSON或YAML)通過管道傳遞。
這是一個非常簡單的示例:
#remember to set restrictive file permissions on this file. This is OS-dependent
USER_CODE_FILE="/home/user/user_code_file.py"
#absolute path to python binary (executable)
PYTHON_PATH="/usr/bin/python"
import subprocess
import json
user_code= '''
import json
my_data= {"a":[1,2,3]}
print json.dumps(my_data)
'''
with open(USER_CODE_FILE,"wb") as f:
f.write(user_code)
user_result_str= subprocess.check_output([PYTHON_PATH, USER_CODE_FILE])
user_result= json.loads( user_result_str )
print user_result
這是一個相當簡單的解決方案,並且具有巨大的開銷。 如果您需要在短時間內多次運行用戶代碼,請不要使用此功能。
最終,此解決方案僅對不老練的攻擊者(用戶)有效。 一般來說,沒有辦法保護任何用戶進程不受用戶本身的侵害-這也沒有多大意義。
如果您確實需要更多保證,並且也希望減輕第一個問題,則應以單獨的(“來賓”)用戶身份運行該過程 。 同樣,這取決於操作系統。
最后警告:盡最大可能避免exec
和eval
。 它們不能保護您的程序或用戶免受輸入的代碼的侵害。 網路上有很多關於此的資訊,只要搜尋「python secure eval」
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.