Tôi thực sự sợ rằng hoạt động read()
vì nó sử dụng bộ nhớ. Ví dụ, ai cũng có thể DDoS máy chủ của tôi bằng cách tải lên một tệp 1gb, đúng không?Làm thế nào để kiểm tra kích thước của tệp được tải lên một cách an toàn trong bottlepy?
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))
Có giải pháp an toàn nào để tải kích thước tệp đã tải lên không? Một dự đoán là lấy kích thước tệp từ hệ thống tệp; request.files.get('data')
có thể được lưu trữ ở đâu đó trong tệp tạm thời phải không?
Nếu bạn chạy chai qua wsgi dưới cái gì đó như apache, apache có thể giới hạn kích thước tải lên. – jordanm
Cửa hàng chai request.body và tất cả các tệp được tải lên trong tệp tạm thời (hoặc bộ đệm ByteIO nếu đủ nhỏ) ngay khi bạn truy cập vào bất kỳ tệp nào trong số đó. Nếu bạn muốn giới hạn kích thước tải lên trước khi máy chủ thực hiện tất cả công việc, hãy kiểm tra request.content_length. Nếu bạn chỉ muốn chắc chắn mọi thứ phù hợp với bộ nhớ, hãy đọc/sao chép các tệp được tải lên theo các phần nhỏ hơn như được mô tả bằng pyfunc trong câu trả lời của mình. – defnull