簡體   English   中英

是否可以限制對python中的代碼塊的全局訪問?

[英]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環境,然后從中接收輸出?

感謝您的時間 :)

澄清編輯 “我想防止主動攻擊和與用戶腳本外部的程序變量的意外交互(因此隱藏所有全局變量)。用戶腳本的大小應較小,並以文本形式輸入。用戶腳本的返回必須為立即,好像它是程序的本機。”

在這種情況下,您要避免兩個單獨的問題:

  • 防止外部攻擊者在OS用戶執行您的程序的上下文中運行任意代碼。 這意味着防止任意代碼執行特權提升
  • 防止程序的合法用戶以意想不到的方式更改程序行為。

對於第一個問題, 您需要確保執行的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

這是一個相當簡單的解決方案,並且具有巨大的開銷。 如果您需要在短時間內多次運行用戶代碼,請不要使用此功能。

最終,此解決方案僅對不老練的攻擊者(用戶)有效。 一般來說,沒有辦法保護任何用戶進程不受用戶本身的侵害-這也沒有多大意義。

如果您確實需要更多保證,並且也希望減輕第一個問題,則應以單獨的(“來賓”)用戶身份運行該過程 同樣,這取決於操作系統。


最后警告:盡最大可能避免execeval 它們不能保護您的程序或用戶免受輸入的代碼的侵害。 網路上有很多關於此的資訊,只要搜尋「python secure eval」

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM