启动'安全'评估()

时间:2012-11-03 17:50:56

标签: python eval bots irc

我正在制作一个irc bot https://github.com/mouuff/MouBot 当消息以!math开头时,我希望机器人回复eval() 但如果用户输入类似!math exit()和类似的内容

,则会导致失败

5 个答案:

答案 0 :(得分:4)

别。

看起来你正在尝试创建一个数学解析器。然后使用数学解析器,而不是一个完整的I-will-run-any-code-parser。如果您使用的是* nix,则可以使用bc之类的程序来执行您想要的操作。

答案 1 :(得分:1)

使用language services将其编译成AST,走AST,确保它只包含列入白名单的节点集,然后执行它。

Example implementation courtesy of unutbu

答案 2 :(得分:0)

eval()的问题是,当它被执行时,它是有效的python代码,而exit()是python代码的有效部分,它通常退出一个程序(虽然这个特定的函数应该在IDLE中使用,sys.exit()在非空闲时使用。)

出于这个原因,eval()应仅用于受信任的输入,或者您应该为传递给eval()函数的命令实现解析器,以消除不需要的输入(可能需要查看shlex函数的split()模块如果你想实现自己的{{1}}函数,我已经将它用于许多解析器。)

答案 3 :(得分:0)

如果你想进行简单的数学评估,为什么你要把整个Python的可能性带到它背后,哪些可能会被滥用。

使用类似PyParsing的内容来编写简单的计算器,例如请参阅SimpleCalc.pyfournfn.py,我认为这些足以让您入门。您也可以尝试SimpleParse

如果你想提供类似强大和可滥用功能的eval,你应该启动一个VM,其中启动服务器进程将回复eval查询,并且当VM进入时,还使用cgroups限制每个进程down启动另一个或保留VM和eval进程池。

答案 4 :(得分:0)

我不确定它可以帮助你,但看看这个 - > http://doc.pypy.org/en/latest/sandbox.html

或者这个 - > Is there an alternative to rexec for Python sandboxing?