探索 ActiveX 控件与浏览器辅助对象的技术奥秘
1. ActiveX 控件的安全使用
IE 提供了大量内置防护措施,旨在保护用户免受系统感染和数据泄露。由于 ActiveX 控件自诞生以来一直受到严格审查,尤其是随着越来越多攻击者利用其漏洞进行攻击,安全问题愈发突出。
1.1 IObjectSafety 接口
IObjectSafety 接口的出现,是为了弥补 ActiveX 控件作为进程内 COM 服务器时几乎不受限制的漏洞。所有版本的 IE 都会阻止 Internet 内容对未标记为可被不可信调用方安全使用的 ActiveX 控件进行初始化和脚本编写的无限制访问。想要被 Internet 内容托管的控件必须实现此接口,并声明自己使用安全。未标记为安全的 ActiveX 控件,除本地机器区域外,在其他区域都无法运行。
初始化保护可防止 ActiveX 控件遭受重利用攻击,攻击者可能会通过 PARAM 标签(通过 IPersist 系列接口发送给控件)向控件传递恶意数据。同样,脚本安全是指防止脚本或外部应用程序尝试使用 ActiveX 控件的公共属性、函数或事件,因为未设计为处理不可信调用方的控件可能会被利用。
1.2 实现 IObjectSafety 接口
在初始化 ActiveX 控件或允许对其进行调用之前,IE 要求控件表明它们将安全处理不可信输入和调用方。实例化控件后,IE 会尝试调用 IObjectSafety.SetInterfaceSafetyOptions() 方法,以此确定控件是否明确表示在遇到不可信初始化数据和调用方时会安全运行。
控件通过返回 INTERFACESAFE_FOR_UNTRUSTED_DATA 声明自己初始化安全,此常量告知 IE 控件可以安全处理可能传递给它的任何初始化数据。控件还可以通过返回 INTERFACESAFE_FOR_UNTRUSTED_CALLER 声明自己“脚本安全”,此常量告知 IE 控件的方法和属性可以由 JavaScript 或 VBScript 调用或设置。如果控件未能实现 SetInterfaceSafetyOptions() 方法,或未能表明对不可信数据或不可信调用方安全,IE 会泄漏控件以防止卸载对象时出现内存安全问题。
以下是 C# 实现 IObjectSafety 接口的代码:
[ComImport]
[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
[PreserveSig]
int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions,
out int pdwEnabledOptions);
[PreserveSig]
int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask,
int dwEnabledOptions);
}
GetInterfaceSafetyOptions(…) 函数由宿主控件调用,以确定子控件采取了哪些安全措施。子控件会报告该控件是否能防止持久化和脚本攻击。SetInterfaceSafetyOptions(…) 则相反,使宿主能够要求特定保护,如果不支持所需的安全性,ActiveX 控件应返回错误代码。
以下是定义接口安全状态的常量:
public static class INTERFACESAFE
{
public const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
public const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
}
最后是在示例 ActiveX 控件中实现 IObjectSafety 接口的代码:
int NativeMethods.IObjectSafety.GetInterfaceSafetyOptions(
ref Guid riid, out int pdwSupportedOptions,
out int pdwEnabledOptions)
{
// Reveal supported and enabled safety options
pdwSupportedOptions = pdwEnabledOptions =
NativeMethods.INTERFACESAFE.INTERFACESAFE_FOR_UNTRUSTED_CALLER |
NativeMethods.INTERFACESAFE.INTERFACESAFE_FOR_UNTRUSTED_DATA;
return S_OK;
}
int NativeMethods.IObjectSafety.SetInterfaceSafetyOptions(
ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
{
// As our code does not have an UNSAFE mode, tell
// the Host that we support any safety options it
// had demanded
return S_OK;
}
实现此接口后,该控件可在 IE 要求控件安全处理不可信数据和调用方的任何安全区域中运行。
1.3 替代平台和技术
ActiveX 控件是仅适用于 IE 的技术,尽管 Google 曾展示过通过 Chrome 浏览器(以及开源的 Chromium 浏览器)对这些控件进行跨浏览器封装,但在 IE 之外使用这些控件尚未成为主流做法。
Netscape、Mozilla Firefox 等使用 Netscape 插件应用程序编程接口(NPAPI)的浏览器,也有类似通过浏览器将页面内容与二进制代码链接的能力。IE 在早期版本中也支持 NPAPI 控件,直到 IE 5.5。这两种控件在安全方面都有过不良记录,但 ActiveX 受到了更多公众和公关的负面反馈。主要架构区别在于,NPAPI 有专门为浏览器和网页使用而构建的 API,而 ActiveX 控件是 Windows 开发中使用的相同 COM 对象。
ActiveX 控件不应与基于脚本的技术(如 Silverlight 和 Flash)混淆。实际上,这些产品的 IE 版本本身就是 ActiveX 控件。它们在很多方面封装并暴露了对网页开发特别有用的二进制功能,使用方便且分布广泛,使开发者无需自定义 ActiveX 或 NPAPI 控件就能增强页面,用户也无需多次安装新控件就能在 Web 上运行数百万个应用程序。
2. 浏览器辅助对象(BHO)
2.1 理解 BHO
BHO 是在浏览器进程中运行但没有正式 UI 的 IE 扩展,实现了 IObjectWithSite 接口。IE 会为加载到浏览器的每个标签页加载一个新的 BHO 实例,并通过 SetSite(…) 方法通知加载的扩展其位置。
尽管 BHO 没有官方 UI 要求,但它们仍可与标签页进程的 UI 线程进行交互。用户可以像管理 ActiveX 控件、工具栏、搜索提供程序等其他 IE 扩展一样管理 BHO,可通过“管理加载项”对话框启用或禁用 BHO。此对话框会显示每个加载项的名称、发布者、启用状态、安装日期和加载时间,但不允许用户卸载 BHO。加载时间是指 IE 加载 BHO 并运行其 SetSite() 回调所需的时间,从 IE 8 开始引入此功能,以鼓励用户禁用可能影响浏览器性能的“慢速”BHO。
2.2 构建通用 BHO
使用 .NET 框架构建 BHO 相对简单。BHO 是实现 IObjectWithSite 接口的基本类,还需具备唯一的 GUID,在机器的 COM 对象中注册,并在特定注册表项下列出。
以下是 C# 中 BHO 的基本架构:
[
ComVisible(true), // Make the object visible to COM
Guid("48DEAC10-D583-4683-9345-3F8A117DE7A5"), // Create a new, unique GUID for each BHO
ClassInterface(ClassInterfaceType.None)] // Don’t create an interface (allow only late-
// bound access via IDispatch)
public class BhoSampleBasic : IObjectWithSite
{
#region Variables ...
#region IObjectWithSite Interface Implementation ...
#region COM Registration Functions ...
}
该类有几个重要属性:使 .NET 类对 COM 可见;定义唯一的 GUID 来标识类;通过将 ClassInterface 属性设置为 ClassInterface.None 防止 .NET 暴露类接口。这样做可迫使 IE 和 BHO 使用双方都能理解的“语言”进行通信。
类的实例成员是一个 WebBrowser 类型的变量 Browser,用于存储 BHO 加载所在的浏览器实例引用,在 SetSite 函数调用时填充。
以下是 IObjectWithSite 接口的定义:
[ComVisible(true),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")]
public interface IObjectWithSite
{
[PreserveSig]
int SetSite([MarshalAs(UnmanagedType.IUnknown)] object site);
[PreserveSig]
int GetSite(ref Guid guid, out IntPtr ppvSite);
}
BHO 类实现此接口的代码如下:
#region IObjectWithSite Interface Implementation
public int SetSite(object site)
{
if (site != null)
{
Browser = (SHDocVw.WebBrowser)site;
System.Windows.Forms.MessageBox.Show("SetSite called!");
}
else Browser = null;
return S_OK;
}
public int GetSite(ref Guid guid, out IntPtr ppvSite)
{
IntPtr pUnk = Marshal.GetIUnknownForObject(Browser);
int hResult = Marshal.QueryInterface(pUnk, ref guid, out ppvSite);
Marshal.Release(pUnk);
return hResult;
}
#endregion IObjectWithSite Interface Implementation
SetSite(…) 函数用于将 IE 站点的 IUnknown 指针传递给实现 BandObject 类的类,IE 在将此类加载到其进程时会调用该函数。GetSite(…) 函数则将 IE 站点返回给调用者。
2.3 注册和运行 BHO
实现 BHO 后,必须在 COM 和 IE 中注册才能加载到浏览器。以下是 COM 注册方法:
#region COM Registration Methods
[ComRegisterFunction]
public static void Register(Type type)
{
RegistryKey bhoKey =
Registry.LocalMachine.CreateSubKey(
@"Software\Microsoft\Windows\CurrentVersion\" +
@"Explorer\Browser Helper Objects");
RegistryKey guidKey
= bhoKey.CreateSubKey(
type.GUID.ToString("B"));
bhoKey.Close();
guidKey.Close();
}
BHO 必须在 IE 中注册才能加载到浏览器并在每个标签页实例中使用。与其他扩展类型不同,BHO 只能列在 HKEY_LOCAL_MACHINE 配置单元中。在 Windows Vista 及更高版本中,必须以具有管理员权限的提升进程来注册和注销 BHO。
在 HKEY_LOCAL_MACHINE 配置单元中,BHO 以扩展的 GUID 命名的子键列出。可通过在 BHO 的子键中创建一个名为 NoExplorer 的 REG_DWORD 来防止 BHO 加载到 Windows 资源管理器中。
注册后,IE 会在加载每个标签页时加载该 BHO 的实例。Unregister() 函数用于删除 Register(…) 函数创建的注册表项。
总结
ActiveX 控件为开发者在网页中获取额外系统访问权限或计算能力提供了很好的解决方案,尤其适用于托管在企业内部网或企业 Web 应用程序上的控件。但由于其存在安全风险,IE 在最近的版本中显著减少了其攻击面。
BHO 则允许开发者访问 IE 静默调用的事件和执行的操作,无需与用户直接交互。通过实现 IObjectWithSite 接口并进行适当的注册,开发者可以轻松构建和使用 BHO。
流程图
graph TD;
A[开始] --> B[创建 ActiveX 控件];
B --> C[实现 IObjectSafety 接口];
C --> D[注册控件];
D --> E[测试控件];
E --> F[创建 BHO];
F --> G[实现 IObjectWithSite 接口];
G --> H[COM 注册 BHO];
H --> I[IE 注册 BHO];
I --> J[运行 BHO];
J --> K[结束];
表格
| 技术 | 适用浏览器 | 安全情况 | 特点 |
|---|---|---|---|
| ActiveX 控件 | IE | 曾受较多安全质疑,有防护措施 | Windows 开发中使用的 COM 对象 |
| NPAPI 控件 | Netscape、Mozilla Firefox 等 | 有安全缺陷 | 有专门为浏览器和网页设计的 API |
| Silverlight 和 Flash | 多种浏览器 | - | 基于脚本,IE 版本本身是 ActiveX 控件 |
| BHO | IE | - | 无正式 UI,实现 IObjectWithSite 接口 |
探索 ActiveX 控件与浏览器辅助对象的技术奥秘(续)
3. 技术对比分析
为了更清晰地理解不同技术之间的差异,我们可以从多个维度进行对比分析。
| 技术维度 | ActiveX 控件 | NPAPI 控件 | Silverlight 和 Flash | BHO |
|---|---|---|---|---|
| 适用范围 | 仅适用于 IE,虽有跨浏览器封装尝试但未成主流 | Netscape、Mozilla Firefox 等使用 NPAPI 的浏览器 | 多种浏览器 | 仅适用于 IE |
| 安全特性 | 曾受大量安全质疑,IE 有防护机制,需实现 IObjectSafety 接口 | 有安全缺陷,早期 IE 曾支持 | - | - |
| 架构特点 | 是 Windows 开发中使用的 COM 对象 | 有专门为浏览器和网页设计的 API | 基于脚本,IE 版本本身是 ActiveX 控件 | 无正式 UI,实现 IObjectWithSite 接口 |
| 开发难度 | 相对复杂,涉及 COM 编程和安全接口实现 | - | 相对简单,有丰富的开发工具和资源 | 使用 .NET 框架构建相对简单 |
| 部署方式 | 需要在系统中注册 | - | 通常通过插件形式部署 | 需要在 COM 和 IE 中注册 |
从这个表格中可以看出,不同技术在适用范围、安全特性、架构特点、开发难度和部署方式等方面存在明显差异。开发者在选择技术时,需要根据具体的需求和场景进行综合考虑。
4. 技术应用场景分析
不同的技术适用于不同的应用场景,下面我们来分析一下 ActiveX 控件和 BHO 的具体应用场景。
4.1 ActiveX 控件的应用场景
- 企业内部网应用 :在企业内部网环境中,由于网络相对封闭,安全风险相对较低,ActiveX 控件可以提供强大的系统访问和计算能力。例如,企业内部的报表系统可以使用 ActiveX 控件实现复杂的数据处理和展示功能。
- 特定行业应用 :某些特定行业的应用程序可能需要与特定的硬件设备进行交互,ActiveX 控件可以方便地实现这种交互。例如,医疗行业的设备监控系统可以使用 ActiveX 控件与医疗设备进行通信。
4.2 BHO 的应用场景
- 广告拦截 :BHO 可以在浏览器加载页面时拦截广告内容,为用户提供更清爽的浏览体验。开发者可以通过监听页面加载事件,识别并阻止广告元素的加载。
- 网页内容过滤 :可以使用 BHO 对网页内容进行过滤,例如过滤不良信息、敏感词汇等。通过分析页面的 HTML 内容,对不符合要求的内容进行屏蔽或替换。
- 自动化操作 :BHO 可以实现一些自动化操作,例如自动填写表单、自动登录等。通过监听用户的操作事件,在合适的时机自动执行相应的操作。
5. 技术发展趋势展望
随着互联网技术的不断发展,ActiveX 控件和 BHO 等技术也面临着新的挑战和机遇。
5.1 ActiveX 控件的发展趋势
- 安全性能提升 :随着安全意识的提高,未来 ActiveX 控件的安全性能将得到进一步提升。开发者将更加注重安全接口的实现和安全机制的设计,以减少安全漏洞的出现。
- 跨平台支持 :虽然目前 ActiveX 控件主要适用于 IE,但未来可能会有更多的跨平台解决方案出现。例如,通过 WebAssembly 等技术实现 ActiveX 控件的跨平台运行。
5.2 BHO 的发展趋势
- 功能拓展 :BHO 的功能将不断拓展,除了现有的广告拦截、网页内容过滤等功能外,还可能会出现更多的实用功能。例如,与人工智能技术结合,实现智能推荐、智能搜索等功能。
- 兼容性优化 :随着浏览器技术的不断更新,BHO 需要不断优化兼容性,以确保在不同版本的浏览器中都能正常运行。
流程图
graph TD;
A[选择技术] --> B{是否需要系统访问权限};
B -- 是 --> C[考虑 ActiveX 控件];
B -- 否 --> D{是否需要监听浏览器事件};
D -- 是 --> E[考虑 BHO];
D -- 否 --> F{是否需要跨浏览器支持};
F -- 是 --> G[考虑 Silverlight 和 Flash 或 NPAPI 控件];
F -- 否 --> H[根据其他需求选择];
C --> I[实现安全接口];
E --> J[实现 IObjectWithSite 接口];
I --> K[注册和测试];
J --> L[注册和运行];
K --> M[应用到项目中];
L --> M;
G --> N[开发和部署];
N --> M;
H --> O[选择合适技术并应用];
O --> M;
M --> P[结束];
总结
本文详细介绍了 ActiveX 控件和浏览器辅助对象(BHO)的相关技术,包括 ActiveX 控件的安全使用、替代平台和技术,以及 BHO 的原理、构建、注册和运行等方面。通过对这些技术的深入理解,开发者可以根据具体需求选择合适的技术来实现网页的扩展和增强。同时,我们也对这些技术的发展趋势进行了展望,希望能为开发者提供一些参考。在实际应用中,开发者需要不断关注技术的发展动态,结合实际情况进行技术选型和开发,以满足不断变化的需求。
列表总结
-
ActiveX 控件
- 需实现 IObjectSafety 接口确保安全
- 主要适用于 IE,跨浏览器使用未成主流
- 适用于企业内部网和特定行业应用
-
BHO
- 实现 IObjectWithSite 接口
- 用于监听浏览器事件,无需与用户直接交互
- 可用于广告拦截、网页内容过滤和自动化操作等场景
-
替代技术
- NPAPI 控件有专门为浏览器设计的 API
- Silverlight 和 Flash 基于脚本,IE 版本为 ActiveX 控件,使用方便且分布广泛
超级会员免费看
2394

被折叠的 条评论
为什么被折叠?



