【发布时间】:2017-02-11 05:50:40
【问题描述】:
我需要运行用户提交的应用程序。我的代码如下:
def run_app(app_path):
inp = open("app.in", "r")
otp = open("app.out", "w")
return subprocess.call(app_path, stdout=otp, stdin=inp)
现在,由于我无法控制用户将提交的内容,因此我想限制应用程序输出的大小。其他诸如试图访问未经授权的系统资源和滥用 CPU 周期的事情正受到 apparmor 规则执行的限制。允许运行的最长时间由父进程(在 python 中)处理。现在,恶意应用程序仍然可以通过将大量数据写入其 stdout 来尝试淹没服务器系统,因为知道 stdout 正在保存到文件中。
我不想为 stdout/stderr 文件使用 AppArmors RLIMIT 或内核模式下的任何东西。能够使用标准库从 python 中做到这一点会很棒。
我目前正在考虑创建一个文件的子类,并在每次写入时检查已将多少数据写入流。或者创建一个设置了最大长度的内存映射文件。
但我觉得可能有一种更简单的方法来限制文件大小,我还没有看到它。
【问题讨论】:
-
你能通过
head管道输出吗? -
@Leon head 可以工作。我正在寻找一些说 outp.maxsize = 10000 的东西。这样就很简单了。我最终可能会使用 RLIMIT 或一位朋友分享了一个关于 /etc/security/limits 的链接 - 任何一个都需要更多配置。
标签: python linux subprocess stdout apparmor