我需要运行用户提交的应用程序。我的代码如下所示:
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 正在保存到文件中。
我不想将 AppArmors RLIMIT 或内核模式下的任何东西用于 stdout/stderr 文件。能够使用标准库从 python 中完成它会很棒。
我目前正在考虑创建一个文件的子类,并在每次写入时检查已将多少数据写入流。或者创建一个设置了最大长度的内存映射文件。
但我觉得可能有一种更简单的方法来限制文件大小我还没有看到它。