मैं कैसे हमले के इस प्रकार से मेरे चर की रक्षा कर सकते हैं:एक दुष्ट प्रोग्रामर से अजगर वर्ग चर की रक्षा कैसे करें?
MyClass.__dict__ = {}
MyClass.__dict__.__setitem__('_MyClass__protectedVariable','...but it is not')
ऊपर चर शब्दकोश बदलता है और उसके बाद यह सभी चर बदलने के लिए बच्चे की खेल है। काम करने के लिए ऊपरी रेखा महत्वपूर्ण है। उपरोक्त काम नहीं करता है यदि आपके शब्दकोश का __setitem__
नीचे जैसा tweaked है)।
मैं चर को बदलने के लिए उपयोगकर्ता को अपनी विधि setProtectedVariable(value)
का उपयोग करने के लिए मजबूर करना चाहता हूं, लेकिन मुझे पाइथन 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()
आप ऐसा क्यों करना चाहते हैं? आप अपनी कक्षा के साथ एक और प्रोग्रामर क्या करते हैं परवाह क्यों करते हैं? आप spec के अनुसार अपना कोड सही तरीके से काम करने के प्रभारी हैं, अगर कोई अन्य प्रोग्रामर इसका दुरुपयोग करना चाहता है तो वह उसकी समस्या है, है ना? –
मुझे संदेह है कि आपको एक दुर्भावनापूर्ण उपयोगकर्ता द्वारा हर संभव दुरुपयोग के खिलाफ सुरक्षा के लिए बुलेटप्रूफ तरीका मिलेगा। आप अब भी हार सकते हैं। – NPE
आप आज सकारात्मक हो रहे हैं ... यह भी प्रश्न का उत्तर है: निजी चर और विधियों में पाइथन में मौजूद हैं और वे क्यों नहीं हैं (क्यों नहीं)। – Juha