簡體   English   中英

如何從邪惡的程序員那里保護python類變量?

[英]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.

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