ner*_*doc 7 python security encapsulation
我有一个问题,我选择Python作为一个更大项目的可能语言的决定取决于答案 - 我自己无法想出:
我们都知道Python没有真正的对象封装,所以没有像对象的"私有"属性.关于这个问题,Guido van Rossum说,人们可以在不被"允许"的情况下访问异物的隐藏部分,"我们都是成年人","就是不要这样做".只要我自己编写的软件是我自己的,我就可以很好地生活,所以我对自己的错误负责,并且可以尝试避免这些事情.
但是 - 这就是我的问题:如果我提供一个带有一些扩展点的插件的插件框架,并且许多插件是由其他人,也许是我完全不能信任的插件.
如何防止暴露我的框架内部被插件访问?
有没有办法实现这一点,或者是使用Python有信心没有人会滥用我的API的唯一方法?
Eri*_*lun 17
你应该从来没有真正依靠private,public等安全性(如"防范恶意代码和外部的威胁").它们意味着让程序员不必在脚下射击,而不是作为(计算机)安全措施.你也可以轻松访问C++对象的私有成员字段,只要你绕过静态编译器检查并直接进入内存,但你会说C++缺乏真正的封装吗?
因此,您永远不会真正使用private或protected作为C++和Java中的恶意插件的安全措施,我也假设C#.
最好的办法是在一个单独的进程中运行插件,并通过IPC/RPC甚至Web服务公开核心API,或者在沙箱中运行它们(根据@MarkHildreth指出的那样).或者,您可以为插件设置认证和签名过程,以便在分发之前查看和过滤掉潜在的恶意插件.
注意:
您可以使用词法闭包实际实现真正的封装:
def Foo(param):
param = [param] # because `nonlocal` was introduced only in 3.x
class _Foo(object):
@property
def param(self):
return param[0]
@param.setter
def param(self, val):
param[0] = val
return _Foo()
foo = Foo('bar')
print foo.param # bar
foo.param = 'baz'
print foo.param # baz
# no way to access `foo._param` or anything
Run Code Online (Sandbox Code Playgroud)
......但即便如此,这个价值实际上仍然可以通过反思轻松获取:
>>> foo.__class__.param.fget.__closure__[0].cell_contents[0] = 'hey'
>>> foo.param
'hey'
Run Code Online (Sandbox Code Playgroud)
...即使这是不可能的,我们仍然会留下ctypes允许直接内存访问,绕过任何剩余的化妆品"限制":
import ctypes
arr = (ctypes.c_ubyte * 64).from_address(id(foo))
Run Code Online (Sandbox Code Playgroud)
现在你可以分配arr或读取它; 虽然你必须努力将指针从那里遍历到存储的实际内存位置.param,但它证明了这一点.
| 归档时间: |
|
| 查看次数: |
1499 次 |
| 最近记录: |