【问题标题】:How to develop (NPAPI) COM plugin for Chrome, Firefox, Safari [duplicate]如何为 Chrome、Firefox、Safari 开发(NPAPI)COM 插件 [重复]
【发布时间】:2013-12-30 10:24:16
【问题描述】:

在我的旧 Web 应用程序中,我需要从 JS 读取用户系统注册表并做一些其他事情。出于安全原因,我不能不使用 ActiveX,所以我编写了一个插件。我的插件由一个 DLL 文件组成,它是一个 COM 组件。这个 COM 组件公开了一些我从 Java Script 代码调用的函数。

在 IE 中,我将我的 DLL 打包到一个 CAB 文件中并安装它,比如 test.dll,方法如下:

<object classid="clsid:some class id here" codebase="test.cab" height="0" width="0" onError="testInstalled=false; return true;" id="testComp"></object>

上面的 HTML 标签将 COM 组件作为插件安装在 IE 中,我可以从我的 JS 代码中访问相同的公开功能:

var testCompApp = document.testComp;
testCompApp.callSomeFunction();

它在 IE 中运行良好。我在其他浏览器(Chrome、Firefox、Safari)中需要相同的功能

您能否建议如何使用我的 DLL 文件为其他浏览器开发插件?

谢谢,

【问题讨论】:

标签: com npapi browser-plugin


【解决方案1】:

我不明白:首先你说“出于安全原因,我不能使用 ActiveX”,然后你做的坏事与 ActiveX 在其所有危险的荣耀中所做的一样:CAB 打包的 COM 对象不受限制地运行原生 Win32。

这样做如何解决您对 ActiveX 的安全问题?

暂且不谈“安全”问题:如果您还没有使用“ActiveX”,那么您已经很接近了。我不记得 [the-IE-plug-in-architecture-that-shares-with-other-stuff-the-marketing-moniker-of] “ActiveX”,但我认为你缺少被称为“ActiveX”的只是一些你必须实现的接口。我还怀疑,由于害羞“ActiveX”,您甚至无法使用 Authenticode 签署您的 CAB,这将为您的用户提供一点信心(假设您保持适当的控制和密钥管理,并且您的用户信任您足以让您的本机代码在他们的计算机上运行)。

无论如何,您编写的 DLL 只能在 IE 中运行。没有其他浏览器支持 Win32 本机 COM 对象(无论您是否选择遵循 ActiveX 规范)。如果你想在其他浏览器上做同样的事情,你将不得不用其他东西重写它。

我认为你(最多)有两种选择来做你想做的事:

  • COM/ActiveX:COM 对象中的本机 Win32 代码。您现在正在做什么。这仅适用于 IE,并且对用户来说非常危险,除非它是在受控环境中完成的(例如,如果这是由企业客户的 IT 部门分发的商业产品,或者如果你有一个既定的存在和声誉,比如一些大公司会这样做)。

  • Java:。假设您的用户安装并启用了正确的运行时,这将在所有浏览器上运行。但只有当 Java 允许通过沙盒授权的方法访问您寻求的信息时,它才对您有用,因为您无法从 Java 沙盒调用注册表 API。您需要插件执行的“其他事情”也是如此。

好的,所以你有第三种选择:

  • 在与浏览器无关的东西中重新实现整个东西:本机 Windows 可执行文件;可能在可下载的安装程序中,也可能是通过 ClickOnce 部署的 .NET 程序。

您陷入困境:您是在说“我在运行 ActiveX 时存在安全问题,但我需要做一些危险的事情”。 任何可以由能够直接访问注册表的 Web 浏览器下载和运行的代码 - 必然 - 是一段危险的代码。任何允许您从浏览器运行此类代码的可想象的技术都将立即引发与 ActiveX 引发的完全相同的安全问题。

在现代浏览器沙盒环境中不加选择地访问注册表是不可能的,因此您要么必须为所需的特定信息找到不同的来源,要么必须使用在 IE 下运行的 ActiveX/COM。

【讨论】:

  • 感谢您的回复。我的 Cab 文件经过严格的签名和验证。您的第三点:“在与浏览器无关的东西中重新实现整个事物:本机 Windows 可执行文件;可能在可下载的安装程序中,或者可能是通过 ClickOnce 部署的 .NET 程序。”您能否详细说明一下,如果可能的话,提供一个示例链接?这种方法似乎更好,也可以跨不同的浏览器实现。
  • 如果我创建一个 MSI 安装程序,它将在不同的浏览器中安装我的 DLL?这种方法可行吗?
  • @AsadRaza 没有“浏览器插件/扩展标准”之类的东西。那么,“在不同的浏览器中安装我的DLL”是什么意思?
  • @manuell,我有 COM dll,它执行一些任务,例如读取注册表等。我需要将此 DLL 作为插件安装在浏览器中,以便可以从 Java 脚本代码中使用它。在 IE 中,我可以简单地将我的 DLL 打包到 CAB 文件中,然后通过 标签安装它。但是如何实现在其他浏览器中的安装呢?如果我创建一个 MSI 安装程序,它将我的 DLL 作为插件安装,那么它可以在所有浏览器中工作吗?
  • 在询问安装/打包之前,先对浏览器中的 标签进行一些测试,以及 JS 如何调用您的 DLL。然后,/如果它有效/,您可能会查看安装问题。建议:考虑改用 Java。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2011-10-08
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多