我正在尝试找到一种处理__init__()
错误的好方法,而不会在追溯中泄露敏感数据。
我有一个基于pxssh的类,我在__init__()
中执行我的连接。
目的是初始化一个对象,以便向子进程发送CLI命令。
class MyClass(pxssh.pxssh):
def __init__(self, credentials):
.
.
.
try:
self.connect(credentials)
except Exception as e:
stderr.write('Error: %s\n' % str(e)
exit(1)
这对于测试来说很好,但是这个类应该被其他代码使用,我不想用exit(1)
来杀死调用者。
我会使用raise
而不是exit(1)
,但问题是credentials
是包含密码和其他一些敏感连接信息的字典。如果调用者只是提出我抛出的任何例外情况,我都不希望看到它被追溯到追溯中。
处理这种情况的最佳方法是什么?
谢谢!
答案 0 :(得分:2)
您可以捕获异常,清除敏感信息,然后重新加注:
class MyClass(pxssh.pxssh):
def __init__(self, credentials):
# ...
try:
self.connect(credentials)
except Exception as e:
credentials.clear()
raise
这完全清空了credentials
字典;对它的任何其他引用也将显示它现在是空的。任何包含locals值的回溯格式化程序都会显示一个空字典。
但请注意,这不能保护您免于泄露,因为任何恶意代码都可以在异常发生之前的任何时间安装sys.settrace()
hook并访问credentials
。
或者攻击者只需用一个包装器替换MyClass.__init__
,该包装器在调用原始版本之前捕获并存储credentials
值。这同样适用于MyClass.connect()
方法。
Python的动态特性使得完全不适合尝试保护您的值不受已经部分进程的攻击者的攻击。</ p>