31、探索 ActiveX 控件与浏览器辅助对象的技术奥秘

探索 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 的原理、构建、注册和运行等方面。通过对这些技术的深入理解,开发者可以根据具体需求选择合适的技术来实现网页的扩展和增强。同时,我们也对这些技术的发展趋势进行了展望,希望能为开发者提供一些参考。在实际应用中,开发者需要不断关注技术的发展动态,结合实际情况进行技术选型和开发,以满足不断变化的需求。

列表总结

  1. ActiveX 控件
    • 需实现 IObjectSafety 接口确保安全
    • 主要适用于 IE,跨浏览器使用未成主流
    • 适用于企业内部网和特定行业应用
  2. BHO
    • 实现 IObjectWithSite 接口
    • 用于监听浏览器事件,无需与用户直接交互
    • 可用于广告拦截、网页内容过滤和自动化操作等场景
  3. 替代技术
    • NPAPI 控件有专门为浏览器设计的 API
    • Silverlight 和 Flash 基于脚本,IE 版本为 ActiveX 控件,使用方便且分布广泛
【电能质量扰动】基于ML和DWT的电能质量扰动分类方法研究(Matlab实现)内容概要:本文研究了一种基于机器学习(ML)和离散小波变换(DWT)的电能质量扰动分类方法,并提供了Matlab实现方案。首先利用DWT对电能质量信号进行多尺度分解,提取信号的时频域特征,有效捕捉电压暂降、暂升、中断、谐波、闪变等常见扰动的关键信息;随后结合机器学习分类器(如SVM、BP神经网络等)对提取的特征进行训练分类,实现对不同类型扰动的自动识别准确区分。该方法充分发挥DWT在信号去噪特征提取方面的优势,结合ML强大的模式识别能力,提升了分类精度鲁棒性,具有较强的实用价值。; 适合人群:电气工程、自动化、电力系统及其自动化等相关专业的研究生、科研人员及从事电能质量监测分析的工程技术人员;具备一定的信号处理基础和Matlab编程能力者更佳。; 使用场景及目标:①应用于智能电网中的电能质量在线监测系统,实现扰动类型的自动识别;②作为高校或科研机构在信号处理、模式识别、电力系统分析等课程的教学案例或科研实验平台;③目标是提高电能质量扰动分类的准确性效率,为后续的电能治理设备保护提供决策依据。; 阅读建议:建议读者结合Matlab代码深入理解DWT的实现过程特征提取步骤,重点关注小波基选择、分解层数设定及特征向量构造对分类性能的影响,并尝试对比不同机器学习模型的分类效果,以全面掌握该方法的核心技术要点。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值