2012-12-27 24 views
5

Có một C# WebBrowser control bên trong ứng dụng WinForms của tôi, và nhận thức được Navigating event, tôi không bao giờ đưa ra một giải pháp tốt đẹp và thanh lịch như sau:Cách phân biệt giữa người dùng nhấp vào liên kết và trang đang thực hiện chuyển hướng tự động?

  1. Nếu người dùng tích cực điều hướng tới một URL khác, tôi muốn cho phép nó.
  2. Nếu trang chuyển hướng "tự nó" sang một URL khác, tôi muốn hủy trang đó.

Đối trường hợp 1 có một số trường hợp tôi có thể nghĩ:

  • Người dùng nhấp thẻ a và thuộc tính href được đánh giá để tải URL khác.
  • Lần nhấp của người dùng trên một phần tử có một trình xử lý sự kiện javascript onclick gọi một chức năng sử dụng window.location để tải một URL khác.

Đối trường hợp 2 tôi có tưởng tượng của:

  • Trang tải chứa một thẻ iframe mà tải một URL bên trong IFrame. Điều này kích hoạt sự kiện Navigating.
  • Có một số bộ đếm thời gian JavaScript được bắt đầu khi tải trang và khi nó kích hoạt, nó sử dụng window.location để tải một URL khác.
  • Trang được tải chứa meta refresh header tag để tải một URL khác sau một vài giây.

Vì vậy, câu hỏi của tôi là:

Làm thế nào để phát hiện bên trong Navigating sự kiện (hoặc bất kỳ cơ chế khác) dù một chuyển hướng được kích hoạt một cách rõ ràng bởi người sử dụng hoặc ngầm bởi trang?

Một số biết thêm thông tin

  • Các WebBrowser đang được sử dụng bên trong một cửa sổ ứng dụng dựa trên backend CMS.
  • Do đó, tôi có toàn quyền kiểm soát nội dung được tải bên trong điều khiển WebBrowser.
  • Có nghĩa là tôi có thể thao tác chuỗi HTML hoàn chỉnh trước khi được gửi tới trình duyệt, nếu được yêu cầu.
  • Nếu ứng dụng được áp dụng nhiều hơn, tôi cũng rất thích nhận các giải pháp chỉ JavaScript mà tôi có thể đưa vào HTML đang được tải.

(Xin lưu ý rằng tôi tin rằng đây không phải là một bản sao của this SO posting)

Trả lời

1

Đưa tôi về đây là chụp người dùng nhấp vào kiểm soát trình duyệt web. Nó đã đặt cờ cho biết người dùng đã nhấp vào trình duyệt web chưa.Nếu cờ là đúng, thì cho phép chuyển hướng, nếu nó không đúng thì không cho phép. Đảm bảo đặt lại cờ sau n số giây nếu không có (hoặc sau) chuyển hướng được thực hiện.

1

Dường như bạn đang cố gắng đạt được mẫu quảng cáo/popup/chuyển hướng.

Từ phối cảnh trình duyệt web .. nhấp vào <a href="some.url"> không khác với javascript window.location = "some.url"; hoặc 302 chuyển hướng phản hồi. không có tín hiệu rõ ràng, không có phương pháp tiện lợi như vậy.

Điều khiển WebBrowser chỉ là proxy cho thành phần IE. Bạn không thể chặn động cơ của trình duyệt hoặc thậm chí tắt/bật javascript vì nó là một phần của tùy chọn bảo mật internet.

Bạn phải tạo logic đặc biệt để ngăn chặn mọi trường hợp có thể chuyển hướng.

ví dụ: xác minh chuỗi HTML sau đó hạn chế một số mẫu, tiêu đề hoặc khung nội tuyến javascript bằng Regex.Replace trước khi kết xuất.

var scriptEx = new Regex("<script (.*?)</script>"); 
var iframeEx = new Regex("<iframe (.*?)</iframe>"); 

hoặc chặn Duyệt URL và hủy url không an toàn, vv

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