我想要一种简单的方法来在 Python 中执行“计算器 API”。
现在我不太关心计算器将支持的确切功能集。
我希望它接收一个字符串,比如说"1+1"
并返回一个带有结果的字符串,在我们的例子中"2"
.
有没有办法制作eval
这样的事情安全吗?
首先我会做
env = {}
env["locals"] = None
env["globals"] = None
env["__name__"] = None
env["__file__"] = None
env["__builtins__"] = None
eval(users_str, env)
这样调用者就不能弄乱我的局部变量(或看到它们)。
但我确信我在这里监督了很多事情。
Are eval
的安全问题是可以解决的,还是有太多微小的细节无法使其正常工作?
eval 的安全问题可以修复吗?
是不是有太多小细节
让它正常工作?
肯定是后者——聪明的黑客总能找到绕过你的预防措施的方法。
如果您对仅使用基本类型文字的纯表达式感到满意,请使用ast.literal_eval http://docs.python.org/library/ast.html?highlight=literal#ast.literal_eval——就是这个目的!对于任何更高级的东西,我推荐一个解析包,例如ply http://www.dabeaz.com/ply/如果您熟悉并熟悉经典的 lexx/yacc 方法,或者py解析 http://pyparsing.wikispaces.com/一种可能更Pythonic的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)