[英]How to protect python class variables from an evil programmer?
如何保護我的變量免受此類攻擊:
MyClass.__dict__ = {}
MyClass.__dict__.__setitem__('_MyClass__protectedVariable','...but it is not')
上面改變了變量字典,之后是孩子們玩改變所有變量。 上線對於此工作至關重要。 如果您的字典的__setitem__
被調整如下,則上述方法無效。
我想強制用戶使用我的方法setProtectedVariable(value)
來改變變量,但我似乎沒有辦法在Python 2.7中這樣做。 有任何想法嗎?
如果您從下面的代碼中找到其他類似的漏洞,我也很感激(我注意到我還應該將文件名和行號添加到myDict.__setitem__
inspect.stack
檢查中)。
這是我到目前為止所嘗試的:
import inspect
class ProtectionTest:
__myPrivate = 0
def __init__(self):
md = myDict()
setattr(self,'__dict__', md)
def __setattr__(self, name, val):
if name == '__myPrivate':
print "failed setattr attempt: __myPrivate"
pass
elif name == '_ProtectionTest__myPrivate':
print "failed setattr attempt: _ProtectionTest__myPrivate"
pass
elif name == '__dict__':
print "failed setattr attempt: __dict__"
pass
else:
self.__dict__[name] = val
def getMyPrivate(self):
return self.__myPrivate
def setMyPrivate(self, myPrivate):
#self.__dict__['_ProtectionTest__stack'] = inspect.stack()[0][1:]
self.__dict__['_ProtectionTest__myPrivate'] = -myPrivate
class myDict(dict):
def __init__(self):
dict.__init__(self)
def __setitem__(self, key, value):
if inspect.stack()[1][3] == 'setMyPrivate':
dict.__setitem__(self,key,value)
else:
print "failed dict attempt"
pass
pt = ProtectionTest()
print "trying to change... (success: 1): "
pt.__myPrivate = 1
print pt.getMyPrivate(), '\n'
print "trying to change... (success: 2): "
pt._ProtectionTest__myPrivate = 2
print pt.getMyPrivate() , '\n'
print "trying to change... (success: 3): "
pt.__dict__['_ProtectionTest__myPrivate'] = 3
print pt.getMyPrivate() , '\n'
print "trying to change the function (success: 4): "
def setMyPrivate(self, myPrivate):
self.__dict__['_ProtectionTest__myPrivate'] = 4
pt.setMyPrivate = setMyPrivate
pt.setMyPrivate(0)
print pt.getMyPrivate(), '\n'
print "trying to change the dict (success: 5): "
pt.__dict__ = {}
pt.__dict__.__setitem__('_ProtectionTest__myPrivate',5)
print pt.getMyPrivate(), '\n'
print "Still working (correct output = -input = -100): "
pt.setMyPrivate(100)
print pt.getMyPrivate()
我覺得有一些深刻的困惑激發了這個問題。 私人變量不是為了阻止邪惡的“黑客”。 它們與安全無關。 他們在那里推廣良好的編程實踐,如保持低耦合 。
如果“邪惡的程序員”可以訪問您的源代碼,他或她可以做任何他或她想要的事情。 調用變量“private”不會改變它。 如果說邪惡的程序員試圖破壞你在另一個系統上執行的程序......調用一個變量“私有”對你沒有好處。 它不會改變程序在內存中存儲和操作的方式。 它只是強制(以不必要的復雜方式IMO) 分離關注點 。
此外,值得注意的是,在正常情況下,您不必經歷所有這些惡作劇......
MyClass.__dict__ = {}
MyClass.__dict__.__setitem__('_MyClass__protectedVariable','...but it is not')
...分配給受保護的var。 你甚至不必覆蓋__dict__
。 你可以這樣做:
MyClass._MyClass__protectedVariable = '...but it is not'
因為它真的不是。 受保護,我的意思是。 名稱修改的主要目的是防止命名空間沖突 。 如果您只想要一個“私有”屬性,只需在其前面加上一個下划線。 期望您的用戶尊重慣例,並期望您的濫用者無論您做什么都會打破它。
在Python中,您不能以這種方式“保護”屬性。 你為什么和你的來電者發生敵對關系? 你和他需要就某些事情達成一致,這是其中之一。 寫出更好的文檔,與他成為更好的朋友。 我不知道你的真正問題是什么,但是用代碼無法解決。
其他語言如Java和C ++提供與private
等分離,但Python根本不提供。 事后你不能把它搞砸。
如果你告訴我們更多關於這個邪惡的程序員是誰,以及為什么你和他不同意你的代碼應該如何使用,我們可能會給你其他解決方案的想法。
AFAIK在Python中沒有辦法做到這一點。 無論你做什么,任何人都可以隨時復制你的源並刪除你的黑客,或者(在大多數情況下)從類繼承並覆蓋它或直接重新分配方法。
但是:你為什么這么關心? 如果你把它命名為__whatever
這是非常清楚的文件,如果用戶搞亂這個,發生的任何不好的事情都是他們自己該死的錯誤。
Python對這種數據更改不是很保護。 但這被認為是一個特征。 對於Python中變量的`final`關鍵字等價的常量/決賽可能有一個不同的問題? 有一些幫助。 回答你的問題:在同一個可執行文件中使用外部代碼運行的類中,可能無法保護數據免受操作。 您很可能需要將數據存儲在單獨的進程中,並提供某種api來與外部進程交換數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.