如何在bottlepy中安全地检查上传文件的大小?

时间:2012-06-27 02:03:03

标签: python bottle

我真的害怕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')可能存储在临时文件中的某个地方吗?

2 个答案:

答案 0 :(得分: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的一种可能方式。

答案 1 :(得分:-3)

这是一个有趣的问题。通常,您要么获取文件对象的统计信息,要么使用os.path来获取大小。 This question之前已被涵盖过。

但是你要问我们在上传它之前如何从服务器告诉客户端文件大小。我认为最好的方法是with JavaScriptThis question可以让您开始了解如何将一些JavaScript代码添加到您的BottlePy应用程序中。

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