在 __repr__ 的单元测试中使用 Python 的 eval() 是否安全?
Is it safe to use Python's eval() in a unit-test for __repr__?
eval()
已被称为 evil, dangerous, bad practice,依此类推。
虽然我倾向于避免使用 eval()
,但我现在很想在单元测试中使用它来实现 __repr__
的自定义实现(如讨论的 here) .
基于 docs 为 __repr__
:
... If at all possible, this should look like a valid Python expression that could be used to recreate an object with the same value (given an appropriate environment). ...
(虽然opinions differ至于这个是不是很有用)
我很想测试 MyClass.__repr__
如下:
assert eval(repr(my_class_instance)) == my_class_instance
(假设 MyClass.__eq__
测试相等性,而不是恒等性,)
这让我想到了我的问题:
假设我们使用“在线”测试运行器,对于 CI/CD,eval()
的这种用法会带来任何安全风险吗?
我认为不会,看到 eval()
的输入是 known 和 trusted,但我我不是安全专家...
eval
被认为是邪恶的,因为当你评估用户提供的字符串时,你隐含地允许他们执行任意代码。
在这里您使用的是硬编码字符串。为了能够执行任意代码,攻击者必须修改测试代码或 __repr__
代码。在任何一种情况下,这意味着他们已经有可能执行任意代码,无论您使用 eval
.
所以我认为在这里使用 eval
没有安全问题。至多,您可以为未来的读者添加一条评论,说明您已经检查了该用法并确定它不会增加安全风险。
eval()
已被称为 evil, dangerous, bad practice,依此类推。
虽然我倾向于避免使用 eval()
,但我现在很想在单元测试中使用它来实现 __repr__
的自定义实现(如讨论的 here) .
基于 docs 为 __repr__
:
... If at all possible, this should look like a valid Python expression that could be used to recreate an object with the same value (given an appropriate environment). ...
(虽然opinions differ至于这个是不是很有用)
我很想测试 MyClass.__repr__
如下:
assert eval(repr(my_class_instance)) == my_class_instance
(假设 MyClass.__eq__
测试相等性,而不是恒等性,
这让我想到了我的问题:
假设我们使用“在线”测试运行器,对于 CI/CD,eval()
的这种用法会带来任何安全风险吗?
我认为不会,看到 eval()
的输入是 known 和 trusted,但我我不是安全专家...
eval
被认为是邪恶的,因为当你评估用户提供的字符串时,你隐含地允许他们执行任意代码。
在这里您使用的是硬编码字符串。为了能够执行任意代码,攻击者必须修改测试代码或 __repr__
代码。在任何一种情况下,这意味着他们已经有可能执行任意代码,无论您使用 eval
.
所以我认为在这里使用 eval
没有安全问题。至多,您可以为未来的读者添加一条评论,说明您已经检查了该用法并确定它不会增加安全风险。