2012-10-19 23 views
7

Đây là lần đầu tiên tôi xây dựng ứng dụng web với mục đích duy nhất là xử lý tệp do người dùng tải lên và tôi có một số câu hỏi liên quan đến cách thức này thường được thực hiện:Thực hành chuẩn để làm việc với các tệp do người dùng tải lên trong ứng dụng web asp.net

  1. Có bất kỳ vấn đề bảo mật nào mà tôi phải tính đến không? Các tệp được xử lý là các tệp văn bản gốc mà ứng dụng của tôi sẽ đọc từng dòng. Tôi có nên hạn chế phần mở rộng của tệp tải lên và/hoặc có bất kỳ biện pháp phòng ngừa nào khác mà tôi nên tính đến không?

  2. Phương pháp tổ chức tốt nhất cho tệp được tải lên là gì? Những tập tin này không cần phải được lưu trữ vĩnh viễn trong ứng dụng của tôi vì vậy tôi nên chỉ cần đổ chúng trong một thư mục "dữ liệu" chung và xóa bất cứ điều gì không còn cần thiết?

  3. Có bất kỳ khía cạnh quan trọng nào khác để xây dựng các ứng dụng web có chức năng tương tự mà tôi đã bỏ lỡ không?

Cảm ơn

+1

Có gì để sắp xếp nếu bạn không cần lưu trữ tệp? Chỉ cần đọc luồng, xử lý và loại bỏ. Không cần phải thực sự lưu các tập tin nếu bạn không cần. – Jamiec

+0

@Jamiec Tôi không biết bạn có thể làm điều này. Bạn có nói rằng tập tin được đọc phía khách hàng và dữ liệu được gửi đến máy chủ? Làm thế nào bạn có thể làm điều này? – Tony

+1

@Tony tệp được đọc và gửi bởi trình duyệt tới máy chủ. Bạn có thể đọc luồng nếu bạn muốn trong bộ nhớ và sau đó chỉ cần vứt nó đi khi bạn đang thực hiện với nó. Tùy thuộc vào lưu lượng truy cập của bạn, điều này có thể đặt một căng thẳng trên máy chủ, mặc dù. Lưu tệp vào đĩa chắc chắn chậm hơn nhưng nó sử dụng ít tài nguyên hơn tại một thời điểm nhất định và bạn có thể trì hoãn việc xử lý nếu nó trở thành vấn đề. – xxbbcc

Trả lời

4
  1. Vấn đề bảo mật duy nhất bạn phải xem là chèn văn bản thô (không quét dữ liệu để tránh chèn SQL) vào cơ sở dữ liệu. Nếu không có cơ sở dữ liệu liên quan, bạn nên ổn. Đối với các phần mở rộng, giới hạn các phần mở rộng thực sự là một bộ lọc cấp cao nhất. Thật tuyệt khi có, nhưng nó chỉ nhìn chăm chú vào những gì mà tập tin thực sự chứa đựng. Giới hạn kích thước tệp cũng sẽ giúp ích.

  2. Lưu vào đĩa có thể tốn kém với số lượng giao dịch lớn, nhưng mặt khác, nó sẽ làm xáo trộn bộ nhớ máy chủ của bạn ít hơn khi nhiều yêu cầu/chuỗi hơn đang được sử dụng. Bạn cũng có thể làm việc với các tập tin trong bộ nhớ, nhưng đối với các tập tin lớn, nó có thể sẽ trở nên bất lợi. Hãy xem xét những gì bạn đang làm việc và chọn cách tiếp cận tốt nhất.

  3. Xác định thời gian chờ để các tệp tải lên lớn sẽ không chiếm các quy trình máy chủ không cần thiết khi cuối cùng quá lớn.

Tôi giả định rằng bạn đang làm việc với điều khiển FileUpload của ASP.NET. Ghi nhớ rằng tập tin không tồn tại thông qua postbacks (để ngăn chặn một lỗ hổng bảo mật), do đó, người dùng phải tiếp tục duyệt đến tập tin mỗi khi trang được yêu cầu. Đây là một mối phiền toái nếu bạn có trình xác thực phía máy chủ.


Edited để trả lời bình luận:

Bằng cách làm việc trong bộ nhớ, tôi đang nói về thao tác các tập tin được tải lên hoàn toàn thông qua mã mà không cần đến nó tiết kiệm vật lý trên đĩa của máy chủ.

Ví dụ, nếu bạn đang sử dụng một điều khiển FileUpload, sau đó hồ sơ của người sử dụng có thể được truy cập thông qua một đối tượng Suối FileUpload.FileContent hoặc như là một mảng byte FileUpload.FileBytes (API Reference). Vì đó là số Stream bạn chỉ có thể đọc tệp khi đang di chuyển mà không phải lưu tệp trước.

Markup:

<asp:FileUpload ID="fileUploadControl" ToolTip="Upload a file" runat="server" /> 

codebehind:

If fileUploadControl.HasFile AndAlso _ 
    (fileUploadControl.FileName.ToLower().EndsWith(".txt") OrElse _ 
    fileUploadControl.ToLower().FileName.EndsWith(".dat")) Then 
    SaveThisToDataBase(fileUploadControl.FileName, fileUploadControl.FileBytes) 
End If 

Thấy không? Không cần phải lưu vào đĩa. fileUploadControl.FileBytes chứa một dấu hiệu của dữ liệu được tải lên.

Nếu bạn muốn lưu vào một tệp, bạn chỉ có thể sử dụng luồng để ghi vào đĩa.

+1

Truy vấn cơ sở dữ liệu của tôi được tham số hóa vì vậy việc tiêm sẽ không sao. Các tập tin là tương đối nhỏ nhưng tôi không quen thuộc với những gì bạn có nghĩa là bằng cách làm việc với các tập tin trong bộ nhớ. Bạn có bất kỳ ví dụ hoặc tham chiếu nào để liên kết tới không? – Tony

+0

+1 Điểm tốt. – xxbbcc

+0

@Tony Xem câu trả lời đã chỉnh sửa của tôi – danyim

3

Tôi không biết làm thế nào 'tiêu chuẩn' Câu trả lời của tôi là nhưng đây là những gì tôi đã làm khi tôi đã có một thiết lập tương tự:

  • tôi giới hạn các phần mở rộng tập tin vào một một số loại tệp, chỉ làm cho việc tải lên các tệp xấu trở nên khó khăn hơn. Thật dễ dàng để né tránh nhưng ít nhất đó là một bước nữa mà một người dùng độc hại sẽ phải thực hiện.

  • Tôi phải thêm quyền ghi vào tài khoản IUSR trong IIS vào thư mục mà tôi đã lưu trữ tệp. Thư mục này là thư mục con của thư mục gốc của ứng dụng của tôi.

  • Tôi phải xử lý nhiều tệp để tôi tạo thư mục con mới cho mỗi tháng, như Uploaded\012012, Uploaded\022012, v.v. Điều này giúp truy cập tệp nhanh hơn vì tôi chỉ có vài trăm tệp trong mỗi thư mục. Tôi đã lưu trữ từng tải lên trong cơ sở dữ liệu và có một nhiệm vụ được lên lịch để dọn dẹp hệ thống tệp thường xuyên. Điều này cũng xóa các thư mục trống cũ.

Như tôi đã nói, tôi không biết đây có phải là tiêu chuẩn hay không, nhưng nó hoạt động tốt cho môi trường tôi đã sử dụng nó.

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