2010-02-26 32 views
19

Tôi có tệp nhạy cảm để tải xuống cho người dùng và mỗi người dùng được phép tải xuống một tệp nhất định một lần. Nếu tải xuống không thành công, tôi muốn cho phép tải xuống lại, nhưng không cho phép. Nó không đủ để dựa vào việc đăng nhập/xử lý việc tải xuống tệp yêu cầu tại máy chủ - tôi cần biết một cách xác định khi tệp hoàn tất và đặt tại máy khách, vì nhiều người dùng của tôi làm việc trong một môi trường kết nối thường xuyên giảm xuống. Cách đơn giản nhất để làm việc này là nếu trình duyệt tiếp xúc với sự kiện "đã lưu tệp" từ hộp thoại Lưu dưới dạng ... có thể được kết nối với chức năng JavaScript trên trang tải xuống (có thể đăng lại máy chủ). Tuy nhiên, trực giác cho thấy có thể có lỗ hổng bảo mật nếu các trình duyệt tiếp xúc với chức năng này, vì nó lẻn ra ngoài một chút so với sandbox. Tôi không chắc chắn điều này thậm chí có thể.Sự kiện trình duyệt khi tệp được tải xuống được lưu vào đĩa

I foundseveralotherquestionsin this area, nhưng không có vấn đề gì cụ thể.

Bất kỳ ý tưởng nào?

Chỉnh sửa: Tôi không nên sử dụng từ "bảo mật" trong câu hỏi ban đầu, xin lỗi vì đã kích hoạt chuỗi màu đỏ.

Chỉnh sửa 2: "Nhân viên bảo mật" lừa đảo những vấn đề bảo mật kỹ thuật ngoại tuyến, nhưng cả hai bạn đều xác nhận rằng "không, không hỗ trợ trình duyệt cho điều đó". Tôi đang đánh dấu người bình luận đầu tiên với câu trả lời vì câu đầu tiên của anh ấy có những gì tôi đang tìm kiếm. Cảm ơn tất cả.

+0

Thậm chí có thể hoạt động không? Tôi có nghĩa là người dùng có thể dễ dàng chặn các yêu cầu "chưa hoàn thành" được gửi đến máy chủ và như một hack tạm thời tầm thường hoàn toàn có thể thu hoạch một số bản sao của một tập tin nhất định. –

Trả lời

9

Không có sự kiện trình duyệt như vậy trong JavaScript và ngay cả khi bạn không thể tin tưởng trình duyệt của người dùng cung cấp bảo mật cho bạn.

Bạn nên sử dụng GUID để tạo URL duy nhất cho mỗi lần tải xuống. Bạn có thể sau đó ví dụ:

  • hãy URL chỉ có giá trị cho một khoảng thời gian cụ
  • phép di chuyển chỉ từ một địa chỉ IP cụ thể liên kết với URL độc đáo
  • để cho server-side code của bạn phát hiện khi nội dung cho một URL duy nhất đã được chuyển hoàn toàn và sau đó làm mất hiệu lực URL.

Hãy để tôi làm rõ viên đạn cuối cùng. Giả sử bạn đang sử dụng Java - bạn sẽ in.read(buffer)out.write(buffer) trong vòng lặp cho đến EOF. Nếu khách hàng ngắt kết nối, bạn sẽ nhận được IOException trong thời gian out.write() và sẽ có thể cho biết tải xuống thành công từ một bị gián đoạn. Trên các nền tảng khác, tôi chắc chắn có nhiều cách để biết liệu kết nối có bị mất hay không.

EDIT: Bạn thực sự có thể kích hoạt sự kiện trình duyệt bằng cách sử dụng mẹo được nêu trong câu trả lời được chấp nhận là one of the questions you linked to. Tuy nhiên, đó không phải là một giải pháp đáng tin cậy để hạn chế số lượng tải xuống.

+0

Chắc chắn, kiểm soát truy cập sẽ được cung cấp bởi các cơ chế bạn mô tả (và các cơ chế khác). Đó là một câu hỏi riêng biệt, mặc dù. Tôi cũng hoàn toàn đồng ý về sự không tin cậy của mã phía máy khách khi đối mặt với cuộc tấn công có chủ ý; may mắn thay, trong môi trường của tôi, tôi có thể chấp nhận vấn đề đó. Câu hỏi của tôi là đảm bảo tải xuống thành công (byte-on-the-client), mà không cần dựa vào máy chủ để đưa ra quyết định (viên đạn thứ 3 của bạn). Vấn đề là máy chủ có thể tin rằng nó đã chuyển tập tin, mà không có tất cả các byte thành công đến khách hàng. –

+0

Tôi chắc chắn sẽ đi cho viên đạn thứ 3, chắc chắn máy chủ có thể biết liệu kết nối có bị mất hay không. – Martin

+1

Nếu bạn có thể chấp nhận một hệ thống "bảo mật" chỉ hoạt động khi không cố ý tấn công, tại sao không chỉ tin tưởng người dùng làm như họ được bảo? Điều đó không có ý nghĩa gì cả ... –

1

Tại sao tệp quan trọng có thể được tải xuống "chính xác một lần"?Khi tệp được tải xuống, tệp có thể được sao chép, vì vậy có vấn đề bảo mật nào khi cho phép cùng một người dùng tải xuống tệp nhiều lần?

Nếu không, bạn có thể làm một cái gì đó như thế này:

  1. Tạo một URL duy nhất để tải về một tập tin nhất định. (Sử dụng GUID để theo dõi nếu cần)
  2. Liên kết URL đó với USER INFO (loại trình duyệt, địa chỉ IP, v.v.) VÀ CỬA THỜI GIAN. Chỉ cho phép tải xuống từ người dùng đó và trong cửa sổ.
  3. Cửa sổ phải đủ dài để người dùng nhận thấy việc chuyển không thành công và thử lại một lần hoặc hai lần, nhưng không còn nữa.

Kết quả cuối cùng là:

  1. Bạn có thể là một cách hợp lý chắc chắn rằng các tập tin được chỉ được tải xuống bởi người nhận.
  2. Bạn có thể chắc chắn rằng người nhận chỉ có thể tải xuống tệp trong một cửa sổ ngắn.
  3. Cùng một người dùng có thể tải xuống tệp nhiều lần, nhưng ai quan tâm? Nó không khác gì so với việc tạo một bản sao cục bộ của tệp đầu tiên.

Nếu bạn thực sự lo lắng về nó, hãy ghi lại từng yêu cầu tải xuống và chạy báo cáo được lập biểu cho các tệp được tải xuống nhiều lần. Nếu bất cứ điều gì trông tanh sau đó bạn có thể kiểm tra bản ghi bảo mật, nói chuyện với người sử dụng, vv

+0

Đó là yêu cầu hợp đồng bên ngoài: Một người dùng nhất định có thể tải xuống tệp một lần. Vấn đề là xác định khi nào sự kiện đó đã xảy ra. Bạn nói đúng, tất nhiên, về sự dễ dàng sao chép một khi một tập tin được tải xuống. Bạn không thể áp dụng logic quá nghiêm ngặt ở đây, nó không hoàn toàn là một vấn đề kỹ thuật. :) Đề xuất của bạn về userinfo/timestamp đã là một phần của thiết kế, cùng với một số tính năng khác. –

+0

@David: thành thật. Trong trường hợp không có bất kỳ tính năng tích hợp nào (mà tôi không nghĩ là tồn tại), bạn đang dựa vào ứng dụng khách để thông báo cho bạn khi quá trình tải xuống hoàn tất và điều đó vốn không đáng tin cậy; nó sẽ không quá khó cho một khách hàng để thiết lập một proxy chặn các xác nhận đó khỏi bị gửi đi. Bạn đã từng nghĩ về việc thiết lập một gói sniffer hoặc công cụ giám sát mạng có thể cho bạn biết nếu tất cả các gói của tập tin đã được gửi đi chưa? Tuy nhiên không có nghĩa là họ đã thành công _received_, nhưng nó đáng tin cậy hơn "hey trình duyệt, cho tôi biết khi bạn đang làm" :) –

+0

Nếu có thể, với mức độ tinh tế thấp của người dùng của chúng tôi và khả năng thời gian- hạn chế thiệt hại có thể được thực hiện bởi một kẻ tấn công tinh vi hơn, nó có khả năng đáng tin cậy "đủ" để đáp ứng yêu cầu hợp đồng (nghĩa là nó sẽ được bảo vệ về mặt pháp lý, nếu không kỹ thuật kín). Nhưng dựa trên các câu trả lời cho đến nay, tôi xác nhận sự nghi ngờ của tôi rằng điều đó là không thể. Cảm ơn đã dành thời gian! –

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