2012-06-27 31 views
5

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?

+0

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

+1

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

Trả lời

2

Bạn có thể kiểm tra xem bạn có thể đọc khối dữ liệu, mỗi lần một dữ liệu hay không.

Nếu đây là tốt rồi:

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)) 

Nếu đây là có thể, sau đó bạn sẽ có thể còn thêm một cơ chế theo dõi về cách lớn một tập tin mà bạn muốn đọc và nếu vượt hủy bỏ hoạt động này.

Cách thức này giải quyết chỉ một trong những cách có thể có của DDOS.

+0

bạn có thể sửa mã của mình không? size = phải được loại bỏ. điều này tạo ra TypeError: read() không có đối số từ khóa, nếu chỉ có 1024 chỉ định nó hoạt động – holms

+0

@holms: Cảm ơn bạn đã sửa. Tôi cho rằng sẽ có một đối số được đặt tên để vượt qua. Hãy thử nhìn vào mã, nó có thể được đặt tên một số điều khác. – pyfunc

-3

Đây là một câu hỏi thú vị. Thông thường bạn có thể lấy số liệu thống kê trên đối tượng tệp hoặc sử dụng os.path để lấy kích thước. This question đã được đề cập trước đó.

Nhưng bạn đang hỏi về cách nói kích thước tệp phía máy khách từ máy chủ trước khi chúng tôi dành thời gian tải lên. Tôi nghĩ rằng cách tốt nhất để làm điều này là with JavaScript. This question có thể giúp bạn bắt đầu cách lấy mã JavaScript vào ứng dụng BottlePy của bạn.

Sử dụng JavaScript để xác thực thông tin nhập của bạn để bạn có thể giả định trong mã máy chủ của mình rằng tệp nằm trong giới hạn của bạn. Khi bạn tìm ra điều này, tôi khuyên bạn nên yêu cầu người dùng BottlePy thêm hỗ trợ trực tiếp vào hỗ trợ BaseRequest.files.

+0

'Nhưng bạn đang hỏi về cách nói kích thước tệp phía máy khách từ máy chủ trước khi chúng tôi dành thời gian tải lên nó.' <- thực sự? Tôi không nhớ đã viết điều đó. bạn có thể thay đổi lĩnh vực đó để kích thước mà vượt qua xác nhận, và vượt qua 1gb tập tin để những gì ..? – holms

+0

Ồ, có lẽ tôi đã hiểu lầm rồi. Tôi nghĩ rằng bạn muốn có được kích thước tập tin mà không lộ mình DDOS ... có lẽ tôi đã giả định một cái gì đó ở đó. Cách duy nhất để làm điều đó là kiểm tra kích thước tập tin trước khi bạn thực sự tải lên, nếu không thì điểm là gì. Tệp lớn đã được tải lên, vì vậy bạn đã không ngăn DDOS. Tùy chọn khác giống như pyfunc gợi ý, nhưng bạn thêm một kiểm tra để thoát ra ở một số giới hạn. Tùy chọn cuối cùng là như bạn đề xuất và nhận được số liệu thống kê trên tệp tạm thời. – ChipJust

+0

@holms "bạn có thể thay đổi trường đó thành kích thước để vượt qua xác thực và chuyển 1gb tệp sao cho ..?" Tôi không hiểu ý của bạn. Bạn kiểm soát mã xác nhận phía máy khách, vì vậy bạn có thể cho phép bất kỳ kích thước nào bạn muốn ... – ChipJust

Các vấn đề liên quan