如何保护python类变量免受邪恶程序员的攻击?

2024-09-30 08:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

如何保护变量免受此类攻击:

MyClass.__dict__ = {}
MyClass.__dict__.__setitem__('_MyClass__protectedVariable','...but it is not')

以上更改变量字典,然后是childs play更改所有变量。上层对这项工作至关重要。如果您的字典的__setitem__被调整为如下所示,那么上面的方法就不起作用了)。在

我想强制用户使用我的方法setProtectedVariable(value)来更改变量,但在Python2.7中似乎找不到这样做的方法。有什么想法吗?在

如果您在下面的代码中发现其他类似的漏洞,我也很感激(我注意到我应该在我的inspect.stack签入myDict.__setitem__中添加文件名和行号)。在

到目前为止,我一直在努力:

^{pr2}$

Tags: 方法用户play字典isvaluemyclassnot
3条回答

不过,在Python中没有一种方法可以做到这一点。不管你做什么,任何人都可以复制你的源代码并删除你的黑客行为,或者(在大多数情况下)从类继承并重写它,或者直接重新分配方法。在

但是:你为什么这么在乎?如果你把它命名为__whatever这是一个非常清楚的文档,如果用户搞砸了,发生的任何糟糕的事情都是他们自己的错。在

我觉得有一些深层次的困惑引发了这个问题。私人变量并不是为了让邪恶的“黑客”远离。他们与安全无关。他们在那里推广良好的编程实践,比如maintaining low coupling。在

如果一个“邪恶的程序员”可以访问你的源代码,他或她可以用它做任何他或她想做的事情。将变量称为“private”不会改变这一点。如果说邪恶的程序员试图破坏你在另一个系统上执行的程序。。。将变量称为“private”对您没有好处。它不会改变程序在内存中的存储和操作方式。它只是强制执行(以不必要的复杂方式IMO)separation of concerns。在

另外,值得注意的是,在正常情况下,你不必经历所有这些恶作剧。。。在

MyClass.__dict__ = {}
MyClass.__dict__.__setitem__('_MyClass__protectedVariable','...but it is not')

…分配给受保护的变量。您甚至不必重写__dict__。你可以这样做:

^{pr2}$

因为它真的不是。我是说受到保护。名称损坏的主要目的是防止namespace collisions。如果只需要一个“private”属性,只需在其前面加上一个下划线。期待你的用户尊重惯例,并期待你的虐待者打破它无论你做什么。在

在Python中,不能用这种方式“保护”属性。为什么你和你的来电者处于敌对关系?你和他需要在一些事情上达成一致,这是其中之一。写更好的医生,和他成为更好的朋友。我不知道你真正的问题是什么,但它不能用代码来解决。在

其他语言如java和C++提供了与^ {CD1>}等的分离,但Python根本不提供。你不能事后再插手。在

如果你告诉我们更多关于这个邪恶的程序员是谁,以及为什么你和他不同意如何使用你的代码,我们也许可以给你其他的解决方案的想法。在

相关问题 更多 >

    热门问题