我正在制作一个irc bot https://github.com/mouuff/MouBot
当消息以!math开头时,我希望机器人回复eval()
但如果用户输入类似!math exit()和类似的内容
答案 0 :(得分:4)
别。
看起来你正在尝试创建一个数学解析器。然后使用数学解析器,而不是一个完整的I-will-run-any-code-parser。如果您使用的是* nix,则可以使用bc
之类的程序来执行您想要的操作。
答案 1 :(得分:1)
使用language services将其编译成AST,走AST,确保它只包含列入白名单的节点集,然后执行它。
答案 2 :(得分:0)
eval()
的问题是,当它被执行时,它是有效的python代码,而exit()
是python代码的有效部分,它通常退出一个程序(虽然这个特定的函数应该在IDLE中使用,sys.exit()
在非空闲时使用。)
出于这个原因,eval()
应仅用于受信任的输入,或者您应该为传递给eval()
函数的命令实现解析器,以消除不需要的输入(可能需要查看shlex
函数的split()
模块如果你想实现自己的{{1}}函数,我已经将它用于许多解析器。)
答案 3 :(得分:0)
如果你想进行简单的数学评估,为什么你要把整个Python的可能性带到它背后,哪些可能会被滥用。
使用类似PyParsing的内容来编写简单的计算器,例如请参阅SimpleCalc.py或fournfn.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?