どのように私はこの種の攻撃から私の変数を保護することができます。悪いプログラマーからPythonのクラス変数を保護するには?
MyClass.__dict__ = {}
MyClass.__dict__.__setitem__('_MyClass__protectedVariable','...but it is not')
上記は、変数の辞書を変更し、その後、すべての変数を変更するにはチャイルズプレイです。このためには上の行が重要です。あなたの辞書の__setitem__
が以下のように調整されている場合、上記は機能しません)。
ユーザーに私のメソッドsetProtectedVariable(value)
を使用させて変数を変更させたいのですが、私はPython 2.7でこれを行う方法がないようです。何か案は?
以下のコードから他の同様の穴が見つかった場合は、私も感謝します。inspect.stack
のチェックにファイル名と行番号を追加する必要があることに気付きました(myDict.__setitem__
)。
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()
なぜこれをやりたいですか?あなたはなぜ、他のプログラマーがあなたのクラスで何をしているのか気にしますか?あなたは仕様に従ってコードを正しく動作させることを担当しています。別のプログラマがそれを悪用しようとしているのであれば、それはそうですか? –
悪意のあるユーザーが悪用する可能性があることを防ぐための防弾方法を見つけることはできません。今もあきらめるかもしれない。 – NPE
あなたは今日好意的です...これは、プライベート変数とメソッドがPythonで存在するのか、なぜそれらが存在しないのかという質問に対する答えです。 – Juha