【问题标题】:Browser Helper Object -> issues with Internet Explorer 9+浏览器帮助对象 -> Internet Explorer 9+ 的问题
【发布时间】:2013-07-11 11:26:13
【问题描述】:

我正在使用 Borland Delphi 6.0 创建一个 Browser Helper Object (BHO)(为了完整起见,这是 2001 年的 Delphi 版本,它编译了原生 32-位 DLL,我注册用于 Internet Explorer)。

BHO 的目的是为特定网页元素添加原始内容所不具备的额外信息。因此,作为我想要实现的那种事情的一个例子,这可能意味着向图像添加一个工具提示,显示有关图片显示内容和创建时间的详细信息 - 我使用 QTip 为此,一个基于 JQuery 的 Javascript 弹出窗口。

我使用 BHO 的 Delphi 组件在 DOM 中搜索我有兴趣修改的页面元素,将这些元素包装在具有唯一类属性的 span 中,然后将几个脚本注入 DOM HEAD(脚本是作为资源编译到 BHO 中,在页面加载时检索,然后将其完整写入文档 - 为每个 IHTMLScriptElement 创建一个新的 IHTMLScriptElement,然后将检索到的脚本分配给脚本元素的 text 属性。

脚本处理寻找我们的那些跨度,然后创建 QTip 对象,当用户在任何目标页面元素上“鼠标悬停”时将出现这些对象(有 3 个脚本,一个 JQuery 副本,一个QTip 和我的用于查找 span 元素的脚本)。

这在我的工作环境中运行良好:带有 Internet Explorer 8.0 的 Windows XP SP3

当我使用更新的 Internet Explorer 副本(9 或更高版本)在更新的 Windows 版本上注册 BHO 时,问题就开始了。 在这里,当我打开一些用于测试的网页时,页面底部会显示一条消息:

“仅显示安全内容”

并提示我允许或禁止被阻止的内容。被阻止的内容似乎是我从 BHO 注入页面的脚本。

所以,问题 1 是:有什么方法可以阻止 IE 为我注入的脚本显示此消息,而无需更改客户端计算机?

另外,当我第一次注册我的 BHO 并启动 IE 时,我在屏幕底部收到一条消息:

“来自未知发布者的 '' 附加组件已准备好使用”

所以问题 2 是,呃,是双重的。首先,有什么方法可以在注册 BHO 时以编程方式将其标记为“可供使用”,以防止出现此消息?或者,或者,删除听起来险恶的“未知出版商”标签的过程是什么 - 我假设这将涉及某种昂贵的数字签名过程,但我无法找到任何有关它的信息。

问题 3,继上一个问题之后,如果我在 IE 告诉我“加载项...已准备好使用”时单击“启用”,它将无法工作,直到我重新启动网络浏览器。我不知道是否有任何方法可以解决这个问题并让它立即开始运行,或者提醒用户必须重新启动浏览器才能执行任何有用的操作 - 建议?

提前感谢您的任何建议和您的时间

附录,SO 抱怨我需要 1500 或更高的声誉才能添加一些我认为与我的问题最相关的标签(例如“浏览器帮助器对象”),因此很抱歉在他们的标签中选择了不太有意义的标签地方。

【问题讨论】:

  • 为什么不使用 //domain 而不是 domain 注入您的脚本,这样它会根据当前使用的域自动使用 http 或 https。这当然意味着您的域需要支持 SSL。
  • 嗨,凯文,谢谢。正如我在下面的回复中对 Eric 所提到的,当我说我正在“注入”脚本时,我认为我可能使用了错误的语言。我将它们写到我添加到文档中的 IHTMLScriptElement 中。那么请原谅我的无知,但我不确定“域”与“//域”指的是什么。
  • 我现在看到您指的是“无协议或相对协议”的 URL。由于我不是添加指向外部脚本的链接,而是添加脚本本身的文本,因此很遗憾,这无济于事,尽管我很感谢您的建议。

标签: internet-explorer bho


【解决方案1】:

不,您不能“预先批准”您的扩展程序以避免“已准备好使用”通知。如果您尝试这样做,Microsoft 将考虑您的扩展恶意软件,并可以完全阻止它在 IE 中加载,将分发它的网站视为恶意等。您根本不应该尝试它。

您必须重新启动浏览器才能使用该扩展程序;在您重新启动浏览器(或启动一个以新选项卡进程结束的新选项卡)之前,它无法正常工作。

您的代码的问题在于它正在注入不使用安全 URL 的内容(例如,将 HTTP URL 注入 HTTPS 页面)。你注入的是什么类型的 URL?您使用的是 RES:// 协议还是其他协议?如果您使用扩展实现的自定义 URL 协议,则需要将该协议配置为被视为“安全”协议(请参阅 QueryInfo 方法中的 Query_Is_Secure 标志)。

【讨论】:

  • 您好,埃里克,感谢您的回复。我想我可能在“注射”中使用了错误的术语,我将在下面发布我正在做的事情的示例。它将是 Delphi,但主要是 Win32 调用,所以希望它是有意义的。我将跳过错误检查部分和其他一些不立即相关的内容:pastebin.com/3vgkBCC6 我正在努力解决此添加评论部分中可用的字符限制和格式化工具(或缺少),所以我很抱歉如果我的回复很混乱,并且 sn-p 是在场外发​​布的。
  • 所以本质上我只是将我想要包含在文档中的 javascript 文件的内容直接喷射到为此目的而创建的新 IHTMLScriptElement(s) 中。我很困惑为什么这会触发有关来自浏览器的不安全内容的警告,但确实如此。另外,感谢您的洞察力。 “预先批准” BHO,我认为可能是这种情况,感谢您澄清情况。
  • 再考虑一下...我“注入”到文档中的第三个脚本对托管在我自己的域上的 PHP 脚本执行 AJAX 请求。 PHP 脚本返回一个 JSON 对象,其中包含用于填充图像等工具提示的信息。那么,这些 AJAX 请求是安全内容警告的可能原因吗?我没有考虑过这一点,因为我认为 IE 只会计数 - 我怎么能放这个?静态链接? - 到外部资源、锚点、img、脚本等,而不是在 javascript 执行期间以编程方式访问的任何东西
  • 更新:从我的第三个脚本中删除 AJAX 请求,重新编译应用程序并重新安装 BHO 似乎证实了这一点......我不确定我现在如何解决这个问题.这是否意味着我必须获得 SSL 证书才能满足 IE 的要求?如果是,当我将脚本注入到未通过安全连接提供服务的文档中时会发生什么情况,在 那种情况下向我的脚本发出访问 HTTPS 的 AJAX 请求会触发错误吗?
  • 是的,一个不安全的AJAX请求会导致这个问题;您要么需要在此处使用 HTTPS URL,要么可以让注入的 JavaScript 调用插件的代码,而不是在浏览器的上下文中发出 HTTP 请求。
猜你喜欢
  • 2011-01-12
  • 2014-05-22
  • 2010-11-03
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多