这是python eval()的安全使用吗?

2024-04-28 18:01:46 发布

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

如果攻击者可以控制attacker_controlled_nasty_variable的值,这段代码是否易受攻击?在

dic={"one":1,
      "nasty":attacker_controlled_nasty_variable,
     }
store=str(dict)
...
dic=eval(store)

Tags: store代码evalvariableonedictstrdic
3条回答

只要您能够确保attacker_controlled_nasty_variable永远不是攻击者可以控制__repr__(或__str__)的对象,就像他可以注入python代码一样。在

但是,最好使用repr(dic)而不是{},因为只有repr才能返回有效的python代码。在

另外,正如@payne提到的,使用更安全的^{},而不是{}。在

是的。可以将其替换为具有__repr__()方法的对象,该方法要么具有有效负载本身,要么返回一个在传递给eval()时可能不安全的字符串。在

概念证明:

class MyClass(object):
  def __repr__(self):
    return 'os.system("format c:")'

bad = [MyClass()]
print str(bad)

使用ast.literal_eval()代替eval()。在

相关问题 更多 >