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

roo*_*ook 4 python security

如果攻击者可以控制其价值attacker_controlled_nasty_variable,那么这部分代码是否容易受到攻击?

dic={"one":1,
      "nasty":attacker_controlled_nasty_variable,
     }
store=str(dict)
...
dic=eval(store)
Run Code Online (Sandbox Code Playgroud)

pay*_*yne 11

ast.literal_eval()而不是eval().


Ign*_*ams 6

是.它可以替换为具有__repr__()方法的对象,该方法具有有效负载本身,或者返回传递给它时可能不安全的字符串eval().

概念证明:

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

bad = [MyClass()]
print str(bad)
Run Code Online (Sandbox Code Playgroud)

  • `class bad_repr(object):def __repr __(self):返回'evil'`(如果他的变量只能是一个字符串,他不能这样做)对于那个类,字符串化的字典看起来像``''讨厌':邪恶, 'one':1}` - 所以`evil`没有引用,可能几乎是任何python代码. (4认同)