2009-01-27 40 views
15

Tôi cần ngăn điều khiển .NET WebBrowser hiển thị bất kỳ "Bạn có muốn mở hoặc lưu tệp này không?" và hộp thoại "Lưu dưới dạng". Thay vào đó, tôi muốn hiển thị một hộp thông báo cho người dùng biết rằng các tệp tải xuống bị tắt vì lý do bảo mật.Cách chặn tải xuống trong điều khiển .NET WebBrowser?

Tôi bắt đầu với sự kiện FileDownload của WebBrowser, nhưng không cho phép hủy. Sau đó, tôi đã sử dụng cách tiếp cận từ CodeProject: Extended .NET 2.0 WebBrowser Control để triển khai sự kiện của riêng mình dựa trên lệnh gọi COM ban đầu bằng cách sử dụng giao diện DWebBrowserEvents2. Khi tôi sửa mã theo an MS knowledge base entry about a bug with the FileDownload signature, trình xử lý sự kiện đã được gọi và tôi có thể hủy quá trình tải xuống.

Tuy nhiên, điều này không hoạt động với tất cả các tải xuống: URL tải xuống trỏ đến URL bao gồm .exe tăng sự kiện và có thể bị hủy trước khi hộp thoại xuất hiện - nhưng đối với những người khác (như .do), trình xử lý sự kiện không được gọi cho đến khi người dùng nhấp vào Open, Save hoặc Cancel trong hộp thoại.

Một giải pháp khả thi có thể là để intercept WH_CALLWNDPROCRET messages and 'answer' the dialog before it is shown to the user, nhưng nó có vẻ như nhiều công sức và tôi cũng muốn một giải pháp sạch hơn ...

Có ai biết làm thế nào để ngăn chặn đáng tin cậy tất cả các tải?

+0

Hãy để tôi nhận được eo biển này ... Bạn muốn cho phép truy cập internet cho người dùng của bạn (không có gì hơn là tải tệp xuống máy tính) và bạn muốn chặn TẤT CẢ tải xuống? – Sergio

+0

@Sergio: Tôi nghĩ, Jens muốn chặn tất cả các tệp, không thể hiển thị trực tiếp trong trình duyệt web. – TcKs

+0

TcK là đúng, tôi muốn chặn mọi thứ không thể hiển thị. Điểm không phải là để ngăn chặn tải xuống, nhưng để ngăn chặn bất kỳ hộp thoại "Lưu tệp dưới dạng" hiển thị để người dùng không có cách nào truy cập vào đĩa cứng. Ứng dụng của tôi được cài đặt làm vỏ cửa sổ (không có Trình khám phá, không có trình đơn bắt đầu). –

Trả lời

3

Bạn có thể sử dụng sự kiện Navigating cho phép hủy.

Bên trong sự kiện này, bạn có thể thử kết nối với URL đang tự điều hướng, kiểm tra tiêu đề phản hồi http và hủy điều hướng nếu phát hiện thấy ContentType không phù hợp.

System.Net.WebRequest request = System.Net.WebRequest.Create(e.Url); 

// we need only header part of http response 
request.Method = "HEAD"; 

System.Net.WebResponse response = request.GetResponse(); 

// only text/html, text/xml, text/plain are allowed... extend as required 
if (!response.ContentType.StartsWith("text/")) 
{ 
    e.Cancel = true; 
    MessageBox.Show("Not allowed for security resons..."); 
} 

Rõ ràng đây không phải là giải pháp chống đạn nhưng có thể cho bạn biết cách bắt đầu (nếu bạn không quan tâm đến việc trả lời các câu trả lời http).

Jens Bannmann đã viết:

Đây không phải là lý tưởng, như tôi đang đối phó với các ứng dụng web mà thêm yêu cầu có thể kích hoạt một hành động được thực hiện hai lần :-(

Sau đó, tôi sẽ tạo một số máy chủ proxy đơn giản sẽ kiểm tra tất cả dữ liệu nhận được và lọc ra tất cả các câu trả lời http có thể kích hoạt hộp thoại "Lưu dưới dạng" trong điều khiển trình duyệt web của bạn

Đơn giản, đừng để điều khiển trình duyệt web của bạn truy cập trực tiếp vào internet nhưng ủy quyền tất cả các yêu cầu http cho máy chủ proxy đặc biệt của bạn sẽ lọc ra tất cả các phản hồi không an toàn từ web.

+0

Hmm, hooking lên một proxy thay vì bằng cách nào đó chặn/vô hiệu hóa các hộp thoại không tấn công tôi như một giải pháp thanh lịch. Dù sao, tôi có thể thêm proxy mà không cần cài đặt phần mềm bổ sung, tức là chỉ sử dụng khung .NET. –

+0

Tôi nghĩ rằng đó là giải pháp khá thanh lịch và có ý nghĩa. Ngoài ra mã của bạn sẽ không đột nhiên phá vỡ với các phiên bản tương lai của IE. Bạn có thể triển khai máy chủ proxy đơn giản trong phần mềm của riêng bạn. Nếu bạn không biết cách thực hiện, hãy đăng câu hỏi khác, bạn sẽ nhận được nhiều câu trả lời hơn. –

+0

proxy sẽ không hoạt động đáng tin cậy vì nó sẽ không thể thấy url hoặc tiêu đề cho kết nối https. – Malcolm

3

Cách đáng tin cậy duy nhất có vẻ là để móc vào hàng đợi sự kiện Windows và ngăn chặn các hộp thoại (như tất cả các loại vật có thể truy cập người dùng).Đây là những gì lớp helper của chúng tôi thực hiện:

void ListenForDialogCreation() 
    { 
     // Listen for name change changes across all processes/threads on current desktop... 
     _WinEventHook = WinAPI.SetWinEventHook(WinAPI.EVENT_OBJECT_CREATE, procDelegate); 
    } 
    void StopListeningForDialogCreation() 
    { 
     WinAPI.UnhookWinEvent(_WinEventHook); 
    } 

    void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) 
    { 
     const uint OBJID_WINDOW = 0; 
     const uint CHILDID_SELF = 0; 

     // filter out non-HWND, and things not children of the current application 
     if (idObject != OBJID_WINDOW || idChild != CHILDID_SELF) 
      return; 

     //Get the window class name 
     StringBuilder ClassName = new StringBuilder(100); 
     WinAPI.GetClassName(hwnd, ClassName, ClassName.Capacity); 

     // Send close message to any dialog 
     if (ClassName.ToString() == "#32770") 
     { 
      WinAPI.SendMessage(hwnd, WinAPI.WM.CLOSE, IntPtr.Zero, IntPtr.Zero); 
      if (OnDialogCancelled != null) 
       OnDialogCancelled(); 
     } 
     if (ClassName.ToString() == "#32768") 
     { 
      WinAPI.SendMessage(hwnd, WinAPI.WM.CLOSE, IntPtr.Zero, IntPtr.Zero); 
      if (OnDialogCancelled != null) 
       OnDialogCancelled(); 
     } 

    } 

    public delegate void OnDialogCancelledEvent(); 
    public event OnDialogCancelledEvent OnDialogCancelled; 
  • # 32770 là lớp Dialog
  • # 32768 là menu pop-up
  • namespace WinAPI là wrappers pinvoke của chúng tôi.

Nếu bạn không muốn chặn tất cả các hộp thoại bạn muốn thêm vào một số bộ lọc bổ sung khi bạn đã bắt được lớp học. Nó phụ thuộc vào mức độ an toàn mà bạn cần. Tại $ WORK, chúng tôi cần chặn tất cả video tải lên và tải xuống.

Ngăn chặn menu bật lên là cần thiết vì nó cung cấp quyền truy cập vào ứng dụng Trợ giúp, cung cấp liên kết tới trang web của microsoft, cho phép hoàn thành phiên bản IE đầy đủ. Sau đó, họ có thể làm bất cứ điều gì họ muốn.

+0

Vâng, bài đăng này có thể hữu ích nếu bạn đã thêm mã lớp WinAPI. = ( –

+0

Đã lâu rồi, nhưng tôi nghĩ chúng tôi chỉ sử dụng pinvoke.net để tạo trình bao bọc cho những gì chúng tôi cần. – Malcolm

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