【问题标题】:Launching 'safe' eval()启动“安全”eval()
【发布时间】:2023-03-13 01:36:01
【问题描述】:

我正在制作一个 irc 机器人 https://github.com/mouuff/MouBot 当消息以 !math 开头时,我希望机器人回复 eval() 但是如果用户输入类似 !math exit() 之类的东西,它会创建失败

【问题讨论】:

  • 请在此处包含代码的相关部分。或者,如果您真的只是在寻找一个没有功能的简单 evalast.literal_eval 应该可以解决问题。
  • "safe eval" - 多么美妙的矛盾修饰符... ..(或者至少有某种形式的访问控制 - (相当于蛋滴上的所有者级别)所以只有那些已经把事情搞砸的人才能这样做)。如果您只想要“!math” - 然后查看pyparsing 及其计算器示例之一,它可以解析字符串并在必要时返回结果
  • 没有安全评估之类的东西
  • 即使你有一个安全的评估(在某种意义上说用户不能做任何明显的黑帽),你也必须处理有人输入9**9**9的情况,这大约是 4.2812477317574708e+369693099。 Python 会很高兴地尝试计算所有的数字,而且还有很多其他的 DOS 攻击向量都是这种方式。走AST的时候用心注意这些是可以处理的,但是很头疼。

标签: python eval bots irc


【解决方案1】:

不要。

您似乎正在尝试创建一个数学解析器。然后使用数学解析器,而不是成熟的 I-will-run-any-code-parser。如果你使用 *nix,你可以使用像 bc 这样的程序来做你想做的事。

【讨论】:

    【解决方案2】:

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

    Example implementation courtesy of unutbu

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        如果您想要简单的数学评估,为什么要使用 Python 的全部力量,这可能而且将会被滥用。

        使用PyParsing 之类的东西来编写一个简单的计算器,例如请参阅 SimpleCalc.pyfournfn.py ,我认为这些足以让您入门。你也可以试试SimpleParse

        如果您确实想提供类似 eval 的强大且可滥用的功能,您应该启动一个 VM,在该 VM 中启动将回复 eval 查询的服务器进程,并在 VM 停止启动时使用 cgroups 限制每个进程另一个或保留一个 VM 和评估进程池。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2016-12-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-15
            • 2017-07-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多