Tôi sẽ thực hiện việc này. Một ứng dụng mà chúng tôi đã làm điều gì đó tương tự như chúng tôi đã làm và chúng tôi đã làm 'cuộn thứ của riêng mình'. Người dùng có thể tải lên các tập tin (hình ảnh, tài liệu, bất cứ điều gì) thông qua giao diện ứng dụng của chúng tôi và những tập tin này có quyền người dùng/công ty/vai trò nhạy cảm. Để giảm thiểu một số lo ngại về bảo mật và vì một vài lý do khác, chúng tôi đã thực hiện như sau.
Trong ứng dụng web, chúng tôi đã tạo thư mục 'Tài sản' được sử dụng để lưu trữ tất cả nội dung do người dùng tạo. Sau đó chúng tôi sử dụng các thư mục con để giúp phân đoạn nội dung (biểu tượng, tệp, v.v.).
Trong web.config, chúng tôi đã định cấu hình thư mục này để không thể truy cập được từ trình duyệt (nghĩ như thư mục App_Data hoặc bin) với các dòng sau đây (Chúng tôi đã thực hiện điều này để đảm bảo không thể truy cập trực tiếp vào các tệp này từ trình duyệt Xem thêm về điểm 4 #):.
<system.webServer>
<security>
<requestFiltering>
<hiddenSegments>
<add segment="Assets"/>
</hiddenSegments>
</requestFiltering>
</security>
Khi một tập tin được tải lên, chúng tôi lưu trữ các thông tin có liên quan về các tập tin trong cơ sở dữ liệu (chủng loại, kích thước, tên, ý kiến). Điều này cũng cho phép chúng tôi liên kết thông tin bảo mật vai trò và người dùng trên tệp.
Để truy xuất tệp, chúng tôi đã triển khai một bộ điều khiển có tên tệp và thông tin người dùng được yêu cầu (vì bạn phải đăng nhập) và trả về tệp từ thư mục Nội dung.Đối với người dùng cuối, có vẻ như tất cả các tệp được lưu trữ trong/Files/Docs/FileID hoặc một cái gì đó tương tự nhưng trong thực tế đây chỉ là một 'gatekeeper' front-end cho chính các tệp đó. Phương thức điều khiển/hành động này trả lại 404 nếu bạn không được ủy quyền hoặc nếu bạn yêu cầu một tệp không hợp lệ. Đối với cách đặt tên tệp, chúng tôi chỉ tạo ra GUID và đặt tên cho tập tin "GUID.relevantExtension" (kiểm tra một mà không tồn tại)
Tôi đoán cho bài học kinh nghiệm hoặc có điều gì, điều quan trọng nhất là bạn không hiển thị trực tiếp các tệp đặc biệt nếu người dùng không chia sẻ nội dung. Ngoài ra, và điều này có lẽ là sở thích cá nhân và có thể bắt đầu chiến tranh nếu không cẩn thận, tôi không lưu trữ tập tin trong cơ sở dữ liệu ở đó có vẻ như gây ra vấn đề về phân trang và lưu trữ bộ nhớ đệm (không nói về cột Tập tin SQL 2008). Hi vọng điêu nay co ich!
EDIT - Một ý nghĩ khác về việc này, hãy lưu ý khi xuất bản từ VS. Các tệp được tải lên này không phải là một phần của giải pháp của bạn và nếu bạn xóa Xóa xuất bản loại Tải lên, bạn sẽ xóa các tệp người dùng của mình. Chỉ cần lời cảnh báo (đã ở đó: /)
Bạn cũng có thể đặt các tài sản bên ngoài webproject bạn/webroot. Bằng cách này nó không thể được truy cập trực tiếp và đồng thời bạn giải quyết vấn đề xuất bản, bởi vì thư mục sẽ không bị ghi đè. –
@RobinvanderKnaap - đó là sự thật, chúng tôi chỉ không có tùy chọn đó với nhà cung cấp dịch vụ lưu trữ của chúng tôi :) – Tommy
+1 cho cảnh báo chỉnh sửa ... đã phát hiện ra điều này một cách khó khăn. – BigMike