覆盖 exec 函数中的函数

Override functions in exec function

我正在开发一个可以轻松执行 Python 代码的移动应用程序,与其他执行应用程序不同,我将 运行 与实际 Python 一起使用它。

我正在使用 Flask Web 服务器并请求完成此操作。

这是我的代码:

@app.route('/exec')
def run():
  exec(request.args.get("code"))

我想覆盖任何打印语句或输出。 使用 string.replace 方法和另一个函数将无法工作,因为如果有人使用像 print("Use the print() function to send output in Python!") 这样的代码,这将是有问题的,人们可能想使用函数名称。我也想输出错误。

对于那些说这不安全的人,我已经对服务器进行了适当的沙盒处理,它大约每小时重置一次,并且有一个备份服务器。

有几种方法可以解决此问题:如果您从与 Flask 相同的进程中执行 exec,最简单的做法是使用“globals”字典调用它并传递您的拥有 print 功能。您也可以替换 sys.out 以将其重新路由到您自己的接收器。

或者,您可以编写一个单独的脚本,从 stdin 读取输入代码,然后 execs 它,并将该脚本作为子进程调用以直接从其输出中读取。这种方式还允许您对用户代码施加比 Flask 代码更严格的限制。

无论您选择哪种方式,请务必同时处理用户代码引发异常或陷入无限循环(或者只是花费太长时间 运行)的情况。这些案例的处理将取决于您采用哪种方法。