覆盖 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 读取输入代码,然后 exec
s 它,并将该脚本作为子进程调用以直接从其输出中读取。这种方式还允许您对用户代码施加比 Flask 代码更严格的限制。
无论您选择哪种方式,请务必同时处理用户代码引发异常或陷入无限循环(或者只是花费太长时间 运行)的情况。这些案例的处理将取决于您采用哪种方法。
我正在开发一个可以轻松执行 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 读取输入代码,然后 exec
s 它,并将该脚本作为子进程调用以直接从其输出中读取。这种方式还允许您对用户代码施加比 Flask 代码更严格的限制。
无论您选择哪种方式,请务必同时处理用户代码引发异常或陷入无限循环(或者只是花费太长时间 运行)的情况。这些案例的处理将取决于您采用哪种方法。