在 __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() 的输入是 knowntrusted,但我我不是安全专家...

eval 被认为是邪恶的,因为当你评估用户提供的字符串时,你隐含地允许他们执行任意代码。

在这里您使用的是硬编码字符串。为了能够执行任意代码,攻击者必须修改测试代码或 __repr__ 代码。在任何一种情况下,这意味着他们已经有可能执行任意代码,无论您使用 eval.

所以我认为在这里使用 eval 没有安全问题。至多,您可以为未来的读者添加一条评论,说明您已经检查了该用法并确定它不会增加安全风险。