Python(2.7):使用敏感信息在初始化中处理错误

2024-06-16 14:54:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一种好方法来处理__init__()中的错误,而不必在回溯中暴露敏感数据。你知道吗

我有一个基于pxsh的类,我在__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是一个包含密码和其他一些敏感连接信息的字典。我不想看到它在回溯中被丢弃,如果调用者只是提出我抛出的任何异常。你知道吗

处理这种情况最好的方法是什么?你知道吗

谢谢你!你知道吗


Tags: 对象方法命令self目的cliinit错误
1条回答
网友
1楼 · 发布于 2024-06-16 14:54:41

您可以捕获异常,清除敏感信息,然后重新引发:

class MyClass(pxssh.pxssh):
    def __init__(self, credentials):
        # ...
        try:
            self.connect(credentials)
        except Exception as e:
            credentials.clear()
            raise

这将清空credentials字典;对它的任何其他引用也将显示它现在是空的。任何包含本地值的回溯格式化程序都将显示一个空字典。你知道吗

但是,请注意,这并不能保护您不被泄露,因为任何恶意代码都可以在异常发生之前的任何时间安装^{} hook并访问credentials。你知道吗

或者攻击者可以简单地用包装器替换MyClass.__init__,该包装器在调用原始版本之前捕获并存储credentials值。这同样适用于MyClass.connect()方法。你知道吗

Python的动态特性使得它完全不适合尝试保护您的值不受攻击者的攻击,而攻击者已经是您进程的一部分。你知道吗

相关问题 更多 >