【发布时间】:2012-07-14 19:34:20
【问题描述】:
我在公共 IRC 机器人中使用 this calculator。鉴于 Python 默认使用任意精度,这将允许任何用户执行 calc 10000**10000**10000 或 calc factorial(1000000) 之类的操作并有效地“杀死”机器人。
我想知道是否有某种方法可以避免这种情况。我已经尝试将表达式中的所有项转换为浮动,但 float(factorial(1000000) 在 Python 解释器中仍然需要很长时间才能完成,而且我不确定多线程方法是否是正确的方法。
【问题讨论】:
-
我知道它使用
eval,但是我尝试执行危险命令已经很久了,我什么也做不了。我知道这并不能保证它是 100% 安全的,但是将要使用的用户是“半可信的”,这意味着他们不会对os做奇怪的事情,但我相信他们会杀了有趣的机器人。 -
这是计算器的实际代码,我用那个代码只是为了让问题更简洁。 pastebin.com/auF1krdh
-
对python一无所知我想你需要像Loic这样的方法:将计算器作为独立进程启动并在指定时间后将其终止。恐怕通过使用阶乘之类的功能,几乎不可能强迫用户只插入快速可计算的输入,有太多的方法可以让你的计算器在脚下射击。
-
@user1002327:请参阅此链接:eval is really dangerous。您应该改用
ast.literal_eval。此外,在一个带有超时的单独线程中运行您的用户输入。这将避免像factorial(1000000)这样的问题。 -
呵呵,感觉好像在其他地方看到过你的评论。我已经阅读了该链接,这就是我没有让用户在集合
[]_;"'中包含任何字符的原因。我希望这会让滥用eval变得更加困难。哦,我函数中的eval明确使用{"__builtins__": None}而不是{'__builtins__':{}},但我不确定它是否会有所不同。无论哪种方式,我都会使用ast.literal_eval看看会发生什么。
标签: python calculator arbitrary-precision