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

hol*_*lms 5 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))
Run Code Online (Sandbox Code Playgroud)

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

pyf*_*unc 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))
Run Code Online (Sandbox Code Playgroud)

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

然而,这仅解决了 DDOS 的一种可能方式。