关于使用Python的eval有很多问题不安全的字符串 (eg.: Python eval() 在不受信任的字符串上的安全性? https://stackoverflow.com/questions/661084/security-of-pythons-eval-on-untrusted-strings, Python:使 eval 安全 https://stackoverflow.com/questions/3513292/python-make-eval-safe)。一致的答案是这是一个坏主意。
但是,我发现很少有关于哪些字符串可以被认为是安全的(如果有的话)的信息。
现在我想知道是否有可用的“安全字符串”定义(例如:仅包含小写 ascii 字符或任何符号 +-*/() 的字符串)。我发现的漏洞通常依赖于 _.,:[]'" 或类似的方法。这种方法是否安全(用于图形绘制 Web 应用程序)?
否则,我想使用 Alex Martelli 建议的解析包是唯一的方法。
编辑:
不幸的是,没有答案能够对为什么/如何将上述字符串视为不安全(一个微小的有效利用)给出令人信服的解释,也没有相反的解释。我知道应该避免使用 eval,但这不是问题。因此,我将向第一个提出有效漏洞或真正很好地解释为什么如上所述被破坏的字符串被认为是(不)安全的人提供赏金。
这里你有一个有效的“漏洞利用”,并且有你的限制 - 只包含小写 ascii 字符或任何符号 +-*/() 。
它依赖于第二个评估层。
def mask_code( python_code ):
s="+".join(["chr("+str(ord(i))+")" for i in python_code])
return "eval("+s+")"
bad_code='''__import__("os").getcwd()'''
masked= mask_code( bad_code )
print masked
print eval(bad_code)
output:
eval(chr(111)+chr(115)+chr(46)+chr(103)+chr(101)+chr(116)+chr(99)+chr(119)+chr(100)+chr(40)+chr(41))
/home/user
这是一个非常琐碎“开发”。我确信还有无数其他的,即使有进一步的字符限制。
值得重复的是,人们应该始终使用解析器或 ast.literal_eval()。只有通过解析标记才能确保字符串可以安全地求值。其他任何事情都是对赌庄。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)