我试图了解在 wsgi 应用程序中安全处理文件上传的最佳方法。似乎很多解决方案都涉及使用 cgi 模块中的 FieldStorage 来解析表单数据。根据我对 FieldStorage 的了解,它通过将数据流式传输到临时文件中,在幕后执行了一些“魔术”。
我不是 100% 清楚的是如何限制包含大于指定数量(比如 10MB)的文件的请求。如果有人上传了一个大小为几 GB 的文件,您显然想在请求占用您服务器的磁盘空间之前阻止该请求,对吗?
在 wsgi 应用程序中限制文件上传的最佳方法是什么?
这将取决于您的前端服务器。如果它有任何配置可以在进入您的应用程序之前阻止大请求,请使用它。
如果你想用你的代码阻止它,我会看到两种方法:
信任 HTTP 标头可能会导致一些问题。假设有人发送了一个 Content-Length: 1024 的请求,但发送了一个 1GB 的请求体。如果您的前端服务器信任标头,它将开始读取此请求,稍后会发现请求正文实际上比它应该的大得多。这种情况仍然可能会填满您的服务器磁盘,即使是“通过”“太大检查”的请求。
虽然这可能发生,但我认为信任 Header 将是一个很好的起点。
您可以在 WSGI 应用程序前面使用您可能拥有的 HTTP 服务器的功能。例如 lighttpd 有很多流量整形选项。