Làm thế nào tôi có thể bảo vệ biến tôi từ loại tấn công này:Làm thế nào để bảo vệ các biến lớp python từ một lập trình độc ác?
MyClass.__dict__ = {}
MyClass.__dict__.__setitem__('_MyClass__protectedVariable','...but it is not')
Trên đây thay đổi từ điển khác nhau và sau đó nó là Childs chơi để thay đổi tất cả các biến. Các dòng trên là rất quan trọng cho việc này để làm việc. Ở trên không hoạt động nếu từ điển của bạn là __setitem__
được tinh chỉnh như dưới đây).
Tôi muốn buộc người dùng sử dụng phương thức setProtectedVariable(value)
của mình để thay đổi biến, nhưng dường như tôi không tìm cách làm điều đó trong Python 2.7. Bất kỳ ý tưởng?
Tôi cũng đánh giá cao nếu bạn tìm thấy các lỗ tương tự khác từ mã bên dưới (Tôi nhận thấy rằng tôi cũng nên thêm tên tệp và số dòng vào số inspect.stack
của mình tại myDict.__setitem__
).
Đây là những gì tôi đã cố gắng cho đến nay:
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()
Tại sao bạn muốn thực hiện việc này? Tại sao bạn quan tâm đến những gì một lập trình viên khác làm với lớp học của bạn? Bạn chịu trách nhiệm làm cho mã của bạn hoạt động đúng theo thông số kỹ thuật, nếu một lập trình viên khác muốn lạm dụng nó là vấn đề của anh ta, phải không? –
Tôi nghi ngờ bạn sẽ tìm thấy một cách chống đạn để bảo vệ chống lại mọi hành vi lạm dụng có thể có của một người dùng độc hại. Bạn có thể bỏ cuộc ngay bây giờ. – NPE
Bạn đang tích cực ngày hôm nay ... Đây cũng là một câu trả lời cho câu hỏi: Do biến cá nhân và phương pháp tồn tại trong python và tại sao họ (không) tồn tại. – Juha