Python(2.7):使用敏感信息在__init__中进行错误处理

时间:2015-04-14 21:13:56

标签: python exception exception-handling password-protection pexpect

我正在尝试找到一种处理__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是包含密码和其他一些敏感连接信息的字典。如果调用者只是提出我抛出的任何例外情况,我都不希望看到它被追溯到追溯中。

处理这种情况的最佳方法是什么?

谢谢!

1 个答案:

答案 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>