关于在 不安全的字符串 上使用 Python 的 eval 有很多关于 SO 的问题(例如:Security of Python's eval() on untrusted strings?,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)
输出:
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()。只有通过解析标记才能确保字符串可以安全评估。其他任何事情都在做空房子。
关于python - 有没有办法为 Python 的 eval 保护字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13066594/