在我的遗留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文件为其他浏览器开发插件?
谢谢,
答案 0 :(得分:0)
我不明白:首先你说“出于安全原因我不能使用ActiveX”,然后你做了与其所有危险的荣耀相同的坏事:一个运行不受限制的CAB打包的COM对象原生Win32。
如何通过ActiveX解决您的安全问题?
暂时搁置一下“安全”的问题:如果你还没有做“ActiveX”,那你就非常接近了。我不记得我头脑中的所有细节[ the-IE-plug-in-architecture-that-shares-with-other-stuff-the-marketing-moniker-of < / em>]“ActiveX”,但我认为你所缺少的被称为“ActiveX”的是你必须实现的一些接口。我还怀疑,由于害羞于“ActiveX”,你甚至无法使用Authenticode签署您的CAB,这将为您的用户提供一点信心(假设您保持适当的控制和密钥管理,并且您的用户信任您足以允许您的本机代码在他们的计算机上运行。)
在任何情况下,您编写的DLL只会在IE中运行。没有其他浏览器支持Win32本机COM对象(无论您是否选择遵循ActiveX规范到字母)。如果你想在其他浏览器中做同样的事情,你将不得不用其他东西重写它。
我认为你(最多)有两种选择可以做你想做的事情:
COM / ActiveX :COM对象中的本机Win32代码。你现在正在做什么。这仅适用于IE,对用户来说非常危险,除非它是在受控环境中完成的(例如,如果这是由企业客户的IT部门分发的商业产品,或者如果您有一个既定的存在和声誉,如某些大公司做。)
<强>爪哇:即可。这将在所有浏览器上运行,假设您的用户已安装并启用了正确的运行时。但是,只有Java允许通过沙盒授权方法访问您所查找的信息,它才能为您工作,因为您无法从Java沙箱中调用注册表API。对于你需要插件来做的“其他东西”也是如此。
好的,所以你有第三个选择:
你是个腌菜:你说“我有运行ActiveX的安全问题,但我需要做一些危险的事情”。 可以通过能够直接访问注册表的Web浏览器下载和运行的任何代码片段 - 必然 - 一段危险的代码。任何允许您从浏览器运行此类代码的可想到的技术都会立即引发与ActiveX引发的安全问题相同的问题。
从现代浏览器沙盒环境中不加区分地访问注册表是不可能的,因此您必须找到所需特定信息的不同来源,或者必须使用在IE下运行的ActiveX / COM。