如何限制WSGI中的大文件上传?

5 投票
2 回答
1988 浏览
提问于 2025-04-17 10:53

我正在尝试了解在wsgi应用中如何安全地处理文件上传的最佳方法。看起来很多解决方案都是使用cgi模块中的FieldStorage来解析表单数据。根据我对FieldStorage的理解,它在后台进行了一些“魔法”,通过将数据流式传输到临时文件中。

我不太清楚的是,如何限制上传文件的请求,比如说限制在10MB以内。如果有人上传一个几GB的文件,显然你希望在它占用服务器的磁盘空间之前就阻止这个请求,对吧?

在wsgi应用中,限制文件上传的最佳方法是什么?

2 个回答

0

你可以利用你在WSGI应用前面可能有的HTTP服务器的一些功能。例如,lighttpd就有很多关于流量控制的选项。

3

这要看你的前端服务器了。如果它有设置可以在请求到达你的应用之前就阻止大请求,那就用这个功能。

如果你想用代码来阻止大请求,我看到有两种方法:

  • 查看请求中的 Content-Length HTTP 头。如果这个值比你能处理的要大,就立刻拒绝这个请求。
  • 不要完全相信这些头信息,开始读取请求的内容,直到达到你的限制。注意,这种方法并不是特别聪明,但可能会有效。=)

相信 HTTP 头信息可能会导致一些问题。假设有人发送了一个请求,头信息里写着 Content-Length: 1024,但实际上传送的是 1GB 的请求内容。如果你的前端服务器相信这个头信息,它会开始读取这个请求,结果后来发现请求内容实际上比它应该的要大得多。这种情况可能会占满你的服务器磁盘,即使这个请求在“过大检查”中“通过”了。

虽然这种情况可能发生,但我认为相信头信息是一个不错的起点。

撰写回答