我需要运行用户提交的应用程序。我的代码看起来像:
def run_app(app_path):
inp = open("app.in", "r")
otp = open("app.out", "w")
return subprocess.call(app_path, stdout=otp, stdin=inp)
Run Code Online (Sandbox Code Playgroud)
现在,由于我无法控制用户将提交的内容,因此我想限制应用程序输出的大小。其他诸如尝试访问未经授权的系统资源和滥用 CPU 周期之类的事情都受到 apparmor 规则实施的限制。允许运行的最长时间由父进程处理(在 python 中)。现在,流氓应用程序仍然可以通过将大量数据写入其标准输出来尝试淹没服务器系统,因为知道标准输出正在保存到文件中。
我不想将 AppArmors RLIMIT 或内核模式下的任何内容用于 stdout/stderr 文件。能够使用标准库从 python 中做到这一点会很棒。
我目前正在考虑创建文件的子类,并在每次写入时检查已将多少数据写入流。或者创建一个设置了最大长度的内存映射文件。
但我觉得可能有一种更简单的方法来限制我还没有看到的文件大小。