6

我真的很害怕那个read()操作,因为它使用内存。例如,任何人都可以通过上传 1gb 文件对我的服务器进行 DDoS 攻击,对吗?

name = request.forms.get('name')
data = request.files.get('data')
if name and data.file:
    raw = data.file.read() # This is dangerous for big files
    filename = data.filename
    return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw))

是否有任何安全的解决方案来获取上传的文件大小?一种猜测是从文件系统中获取文件大小;request.files.get('data')可能存储在临时文件中的某个地方吧?

4

2 回答 2

2

你能检查一下你是否可以一次读取大块数据。

如果这是可能的,那么:

name = request.forms.get('name')
data = request.files.get('data')
raw = ""
if name and data.file:
    while True:
        datachunk = data.file.read(1024)
        if not datachunk:
            break
        raw = raw + datachunk

    filename = data.filename
    return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw))

如果这是可能的,那么您应该还可以添加一个跟踪机制来跟踪您想要读取的文件大小,如果超出则中止此操作。

但是,这仅解决了 DDOS 的一种可能方式。

于 2012-06-27T02:29:20.237 回答
-3

这是个有趣的问题。通常,您要么获取文件对象的统计信息,要么使用 os.path 获取大小。这个问题之前已经讨论过了。

但是您问的是如何在我们花时间上传之前从服务器告诉客户端文件大小。我认为最好的方法是使用 JavaScript这个问题可以让您开始了解如何将一些 JavaScript 代码放入您的 BottlePy 应用程序。

使用 JavaScript 验证您的输入,以便您可以在服务器代码中假设该文件在您的限制范围内。一旦你弄清楚了,我建议你让 BottlePy 人员直接将对此的支持添加到 BaseRequest.files 支持中。

于 2012-06-27T02:55:23.607 回答