Python (2.7):__init__ 中包含敏感信息的错误处理
Python (2.7): Error Handling in __init__ with Sensitive Information
我正在尝试找到一种处理 __init__()
中错误的好方法,同时又不会在回溯中泄露敏感数据。
我有一个基于 pxssh 的 class,我在 __init__()
中执行我的连接。
目的是初始化 object 以将 CLI 命令发送到 child.
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)
这对于测试来说很好,但是这个 class 是要被其他代码使用的,我不想用 exit(1)
.
杀死调用者
我会使用 raise
而不是 exit(1)
,但问题是 credentials
是一个包含密码和其他一些敏感连接信息的字典。如果调用者只是引发我抛出的任何异常,我不想看到它被丢弃在回溯中。
处理这种情况的最佳方法是什么?
谢谢!
可以捕获异常,清除敏感信息,然后重新提出:
class MyClass(pxssh.pxssh):
def __init__(self, credentials):
# ...
try:
self.connect(credentials)
except Exception as e:
credentials.clear()
raise
这将完全清空 credentials
字典;对它的任何其他引用也将显示它现在是空的。任何包含本地值的回溯格式化程序都将显示一个空字典。
但是,请注意,这不能保护您免受泄露,因为任何恶意代码都可以简单地安装 sys.settrace()
hook 并在异常发生之前随时访问 credentials
。
或者攻击者可以简单地将 MyClass.__init__
替换为包装器,该包装器在调用原始版本之前捕获并存储 credentials
值。 MyClass.connect()
方法也是如此。
Python 的动态特性使其完全不适合尝试保护您的值免受攻击者的攻击,而攻击者已经 是您流程的一部分。
我正在尝试找到一种处理 __init__()
中错误的好方法,同时又不会在回溯中泄露敏感数据。
我有一个基于 pxssh 的 class,我在 __init__()
中执行我的连接。
目的是初始化 object 以将 CLI 命令发送到 child.
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)
这对于测试来说很好,但是这个 class 是要被其他代码使用的,我不想用 exit(1)
.
我会使用 raise
而不是 exit(1)
,但问题是 credentials
是一个包含密码和其他一些敏感连接信息的字典。如果调用者只是引发我抛出的任何异常,我不想看到它被丢弃在回溯中。
处理这种情况的最佳方法是什么?
谢谢!
可以捕获异常,清除敏感信息,然后重新提出:
class MyClass(pxssh.pxssh):
def __init__(self, credentials):
# ...
try:
self.connect(credentials)
except Exception as e:
credentials.clear()
raise
这将完全清空 credentials
字典;对它的任何其他引用也将显示它现在是空的。任何包含本地值的回溯格式化程序都将显示一个空字典。
但是,请注意,这不能保护您免受泄露,因为任何恶意代码都可以简单地安装 sys.settrace()
hook 并在异常发生之前随时访问 credentials
。
或者攻击者可以简单地将 MyClass.__init__
替换为包装器,该包装器在调用原始版本之前捕获并存储 credentials
值。 MyClass.connect()
方法也是如此。
Python 的动态特性使其完全不适合尝试保护您的值免受攻击者的攻击,而攻击者已经 是您流程的一部分。