5

在我的 WinForms 应用程序中有一个 C#WebBrowser控件,并且知道Navigating事件,我从来没有想出一个好的和优雅的解决方案来解决以下问题:

  1. 如果用户主动导航到另一个 URL,我想允许它。
  2. 如果页面“自行”重定向到另一个 URL,我想取消它。

对于案例1,我可以想到一些案例:

  • 用户单击一个a标签并href评估该属性以加载另一个 URL。
  • 用户单击带有onclickjavascript 事件处理程序的元素,该事件处理程序调用window.location用于加载另一个 URL 的函数。

对于案例 2,我可以想象:

  • 加载的页面包含一个iframe在 IFrame 中加载 URL 的标记。这会触发Navigating事件。
  • 有一些 JavaScript 计时器在页面加载时启动,当它触发时,它用于window.location加载另一个 URL。
  • 加载的页面包含一个meta refresh标题标签,用于在几秒钟后加载另一个 URL。

所以我的问题是:

如何在Navigating事件(或任何其他机制)内部检测重定向是由用户显式触发还是由页面隐式触发?

更多信息

  • WebBrowser正在基于 Windows 的 CMS 后端应用程序中使用。
  • 因此,我可以完全控制 WebBrowser 控件中加载的内容。
  • 这意味着如果需要,我可以在发送到浏览器之前操作完整的 HTML 字符串。
  • 如果它更适用,我也很想获得可以注入到正在加载的 HTML 中的纯 JavaScript 解决方案。

(请注意,我相信这不是此 SO 帖子的副本)

4

2 回答 2

1

我对此的看法是捕获用户对 Web 浏览器控件的点击。让它设置一个标志,表明用户点击了网络浏览器。如果标志为真,则允许重定向,如果不是,则不允许它。如果没有(或之后)进行重定向,请确保在 n 秒后重置标志。

于 2012-12-27T08:00:36.937 回答
1

看来您正在尝试实现反广告/弹出/重定向模式。

从网络浏览器的角度来看..点击与 javascript或302 重定向响应<a href="some.url">没有什么不同。没有明确的信号,没有这样的方便方法。window.location = "some.url";

WebBrowser 控件只是 IE 组件的代理。您无法拦截浏览器的引擎,甚至无法禁用/启用 javascript,因为它是 Internet 安全选项的一部分。

您必须创建特殊的逻辑来防止所有可能的重定向情况。

例如。验证 HTML 字符串,然后在渲染之前使用 Regex.Replace 限制一些 javascript 模式、标题或 iframe。

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

或者拦截Navigating URL并取消不安全的url等。

于 2012-12-27T08:02:55.287 回答