2008-11-11 42 views
11

Trình duyệt web có gửi kích thước tệp trong tiêu đề http khi tải tệp lên máy chủ không? Và nếu đó là trường hợp, sau đó, là nó có thể từ chối các tập tin chỉ bằng cách đọc tiêu đề và không chờ đợi cho toàn bộ quá trình tải lên để kết thúc?Kích thước của tệp được tải lên

Trả lời

11

http://www.faqs.org/rfcs/rfc1867.html

HTTP khách hàng đang khuyến khích để cung cấp nội dung có độ dài cho đầu vào tập tin tổng thể để cho một máy chủ bận rộn thể phát hiện nếu dữ liệu tập tin được đề xuất là quá lớn để có xử lý một cách hợp lý

Nhưng độ dài nội dung là không bắt buộc, vì vậy bạn không thể dựa vào nó. Ngoài ra, kẻ tấn công có thể giả mạo một chiều dài nội dung sai.

Để đọc nội dung tệp là cách đáng tin cậy duy nhất. Có nói rằng, nếu nội dung-chiều dài là hiện tại và là quá lớn, để đóng kết nối sẽ là một điều hợp lý để làm.

Ngoài ra, nội dung được gửi dưới dạng nhiều phần, vì vậy, hầu hết các khung công tác hiện đại giải mã nó trước tiên. Điều đó có nghĩa là bạn sẽ không nhận được luồng byte của tệp cho đến khi khung được thực hiện, điều này có nghĩa là "cho đến khi toàn bộ tệp được tải lên".

1
  1. Tôi không chắc chắn, nhưng bạn không thực sự tin tưởng bất cứ điều gì được gửi trong tiêu đề vì nó có thể được giả mạo bởi người dùng.

  2. Tùy thuộc vào cách máy chủ hoạt động. Ví dụ trong PHP, tập lệnh của bạn sẽ không chạy cho đến khi quá trình tải lên tệp hoàn tất, vì vậy điều này sẽ không thể thực hiện được.

2

EDIT: trước khi đi quá xa, bạn có thể muốn kiểm tra câu trả lời khác này dựa vào cấu hình apache: Using jQuery, Restricting File Size Before Uploading. mô tả bên dưới chỉ hữu ích nếu bạn thực sự cần phản hồi tùy chỉnh hơn nữa.

Có, bạn có thể nhận được một số thông tin trả trước, trước khi cho phép tải lên toàn bộ tệp.

Dưới đây là một ví dụ về tiêu đề đến từ một hình thức với enctype="multipart/form-data" thuộc tính:

POST/HTTP/1.1 
Host: 127.0.0.1:8000 
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.7,fr-be;q=0.3 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=---------------------------886261531333586100294758961 
Content-Length: 135361 

-----------------------------886261531333586100294758961 
Content-Disposition: form-data; name=""; filename="IMG_1132.jpg" 
Content-Type: image/jpeg 

(data starts here and ends with -----------------------------886261531333586100294758961) 

Bạn có Content-Length trong tiêu đề, và bổ sung đó là Content-Type trong tiêu đề của phần tập tin (mỗi tệp có tiêu đề của riêng nó, đó là mục đích của mã hóa đa phần). Cẩn thận rằng đó là trách nhiệm của trình duyệt để đặt Loại nội dung có liên quan bằng cách đoán loại tệp; bạn không thể đảm bảo nó, nhưng nó phải là khá đáng tin cậy cho từ chối sớm (nhưng bạn nên kiểm tra toàn bộ tập tin khi nó hoàn toàn có sẵn).

Bây giờ, có một hình ảnh xác thực. Tôi đã sử dụng để lọc các tập tin hình ảnh như vậy, không phải trên kích thước, nhưng trên loại nội dung; nhưng khi bạn muốn dừng yêu cầu càng sớm càng tốt, cùng một vấn đề phát sinh: trình duyệt chỉ nhận được phản hồi của bạn khi toàn bộ yêu cầu được gửi, bao gồm nội dung biểu mẫu và do đó các tệp được tải lên.

Nếu bạn không muốn nội dung được cung cấp và ngừng tải lên, bạn không có lựa chọn nào khác ngoài việc đóng cửa ổ cắm một cách tàn bạo. Người dùng sẽ chỉ thấy thông báo "kết nối lại bằng cách đồng bộ hóa" gây nhầm lẫn. Và điều đó hút, nhưng đó là do thiết kế.

Vì vậy, bạn chỉ muốn sử dụng phương pháp này trong trường hợp kiểm tra nền không đồng bộ (sử dụng bộ đếm thời gian kiểm tra trường tệp). Vì vậy, tôi đã có hack:

  • tôi sử dụng jquery để cho tôi biết nếu trường Tệp đã thay đổi
  • Khi một tập tin mới được chọn, vô hiệu hóa tất cả các lĩnh vực tập tin khác về hình thức tương tự để có được chỉ có một mà .
  • Gửi tệp không đồng bộ (jQuery có thể làm điều đó cho bạn, nó sử dụng khung ẩn)
  • Phía máy chủ, kiểm tra tiêu đề (độ dài nội dung, loại nội dung, ...), cắt kết nối ngay sau đó khi bạn có những gì bạn cần.
  • Đặt biến phiên cho biết tệp đó có OK hay không.
  • Phía máy khách, vì tệp được tải lên khung bạn thậm chí không nhận được bất kỳ phản hồi nào nếu kết nối được đóng. Lựa chọn duy nhất của bạn là bộ hẹn giờ.
  • Phía máy khách, bộ đếm thời gian thăm dò ý kiến ​​máy chủ để nhận trạng thái cho tệp được tải lên. Phía máy chủ, bạn có bộ biến phiên đó, gửi lại cho trình duyệt.
  • Khách hàng có mã trạng thái; đưa nó vào biểu mẫu của bạn: thông báo lỗi, dấu kiểm màu xanh lục/dấu X màu đỏ, bất cứ điều gì. Đặt lại trường tệp hoặc tắt biểu mẫu, bạn quyết định. Đừng quên kích hoạt lại các trường tệp khác.

Khá lộn xộn, eh? Nếu bất kỳ ai trong các bạn có một lựa chọn tốt hơn, tôi là tất cả các tai.

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