Come posso proteggere i miei variabili da questo tipo di attacco:Come proteggere le variabili di classe Python da un programmatore malvagio?
MyClass.__dict__ = {}
MyClass.__dict__.__setitem__('_MyClass__protectedVariable','...but it is not')
È possibile che questo cambia il dizionario variabile e dopo che è un gioco da ragazzi per cambiare tutte le variabili. La linea superiore è cruciale per questo lavoro. Quanto sopra non funziona se il tuo dizionario è __setitem__
ottimizzato come di seguito).
Voglio forzare l'utente ad usare il mio metodo setProtectedVariable(value)
per cambiare la variabile, ma non trovo il modo di farlo in Python 2.7. Qualche idea?
Apprezzo anche se trovi altri buchi simili dal codice qui sotto (ho notato che dovrei aggiungere anche il nome del file e il numero di linea al mio assegno inspect.stack
myDict.__setitem__
).
Questo è quello che ho provato finora:
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()
Perché vuoi farlo? Perché ti importa cosa fa un altro programmatore con la tua classe? Sei incaricato di far funzionare correttamente il tuo codice secondo le specifiche, se un altro programmatore vuole abusarne è il suo problema, vero? –
Dubito che troverai un modo antiproiettile per proteggere da ogni possibile abuso da parte di un utente malintenzionato. Puoi anche arrenderti ora. – NPE
Oggi sei positivo ... Questa è anche una risposta alla domanda: esistono variabili e metodi privati in python e perché non esistono (esistono). – Juha