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 的动态特性使其完全不适合尝试保护您的值免受攻击者的攻击,而攻击者已经 是您流程的一部分。