用浏览器辅助对象控制浏览器导航条

作者: Phillip Perkins
2005-10-20 11:15 AM

我曾经读过关于Mozilla扩展插件AdBlock的一篇文章。该插件允许用户输入过滤表达来限制浏览器接收的内容。这启发了我,使我想到我也能在IE上应用同样的方法限制信息。在这篇文章中,我将建立一个基本的内容过滤器,它使用浏览器辅助对象(BHOs)功能来控制浏览器导航条。我们唯一需要讨论的东西是图像和网页。

浏览器辅助对象是一个在IE中运行的ActiveX动态链接库,它能执行与WebBrowser控件一样的功能,以及其他一些事件。当IE打开一个网页时,就产生了几个事件。其中一个是BeforeNavigate2事件,它代替了WebBrowser控件中以前的BeforeNavigate和 FrameBeforeNavigate事件。

在浏览器浏览到一个特定的URL地址之前,BeforeNavigate2事件发生。在这一事件中,传递了几个参数,包括pDisp(事件来源的分配指针)、URL地址、导航标及PostData。你可以用pDisp指针来设定一个WebBrowser控件当地变量。这让我们拥有了控件的所有功能,如Stor()方法。Stor()方法将阻止当前导航条,而且我们可以通过利用Navigate2()方法来浏览我们选择的URL地址来补充我们的URL地址。

在这一过程中发生的另一个事件是NavigateComplete2事件,它代替了以前的NavigateComplete和FrameNavigateComplete事件。当浏览器完成浏览指定的URL地址时,NavigateComplete2事件发生。但是,在这个时间点,图像、对象和脚本可能还在下载过程中。在这一事件中,我们可以用IE对象的文本属性来检查图像,以改变不良图像的src值。

为了识别不良URL地址,我们用规则的表达式来找出并攻击这些URL地址。为方便使用,你可以将这些表达式存储在一个单独的文本文件中。我们对页面及图像的URL地址进行测试来识别不良URL地址。没有通过测试的URL将会转到另一个更友好的URL地址,如一个“拒绝访问”页面或图像。

为了建立BHO功能,我们必须在Visual Basic中执行IobjectWithSite界面。参考一下我将包含在下载样本中的类库文件,你就会拥有执行这一界面的能力。你还必须参考微软脚本运行期库、微软VB规则表达库5.5、微软互联网控件库和微软HTML对象库。

以下为代码:


Option Explicit
Option Base 0

Implements IObjectWithSiteTLB.IObjectWithSite
Dim WithEvents m_ie As InternetExplorer
Dim m_Site As IUnknownVB
Dim m_lError As Long
Dim m_sError As String
Dim sURLs As String

Private Sub Class_Initialize()
    Dim fso As Scripting.FileSystemObject
    Dim ts As Scripting.TextStream
    Set fso = New Scripting.FileSystemObject
    Set ts = fso.OpenTextFile(App.Path & "/urls.txt", ForReading, False)
    sURLs = ts.ReadAll()
    ts.Close
    Set ts = Nothing
    Set fso = Nothing
End Sub

Private Sub IObjectWithSite_GetSite(ByVal priid As
 IObjectWithSiteTLB.GUIDPtr, ppvObj As IObjectWithSiteTLB.VOIDPtr)
    m_Site.QueryInterface priid, ppvObj
End Sub

Private Sub IObjectWithSite_SetSite(ByVal pSite As
 IObjectWithSiteTLB.IUnknownVB)
    Set m_Site = pSite
    Set m_ie = pSite
End Sub

Private Sub m_ie_BeforeNavigate2(ByVal pDisp As Object, URL As Variant,
 Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers
 As Variant, Cancel As Boolean)
    Dim re As RegExp
    Set re = New RegExp
    Dim wbc As WebBrowser
    m_lError = 0
    m_sError = ""
    re.Pattern = sURLs
    If re.Test(URL) Then
        Cancel = True
        Set wbc = pDisp
        wbc.Stop
        wbc.Navigate2 "file:///" & Replace(Replace(App.Path &
 "/access_denied.htm", ":", "|", 1, 1), "/", "/"), Flags, TargetFrameName
    End If
    Set re = Nothing
    Set wbc = Nothing
End Sub

Private Sub m_ie_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
    Dim img As MSHTML.HTMLImg
    Dim doc As MSHTML.HTMLDocument
    Dim re As RegExp
    Set doc = m_ie.document
    Set re = New RegExp
    re.Pattern = sURLs
    For Each img In doc.images
        If re.Test(img.src) Then _
            img.src = "file:///" & Replace(Replace(App.Path &
 "/access_denied.jpg", ":", "|", 1, 1), "/", "/")
    Next
    Set re = Nothing
    Set img = Nothing
    Set doc = Nothing
End Sub


除了IObjectWithSite_GetSite 和_SetSite步骤。还要注意当地变量m_ie要在IObjectWithSite_SetSite步骤中设定给pSite参数。这给了我们InternetExplorer对象的一个当地实例,还让我们了解该对象中发生的事件---在类代码顶部指定WithEvents变量。当这个类初始化时,URL限制即从相应的文本文件中加载。
在m_ie_BeforeNavigate2事件处理器中,你可以看到我利用pDisp参数得到解决的一个当地实例。我创建了一个RegExp对象来测试该URL。如果该URL不是我们想要的URL,就转到一个当地的HTML文件,这个文件是一个类型的HTML文件,它温和地告诉用户他们查看的URL不能访问。

在m_ie_BeforeNavigate2事件处理器中,我得到一个HTMLDocument当地实例,然后我利用此当地实例来浏览所有的图像,并检查不良RUL的src属性。如果我遇到一个不良URL,就将它的src属性转到一个本地的JPEG图像,它告诉用户此图像不允许查看。这种方法的缺点在于,当用户刷新网页时,原始的图像就下载并显示。

为了在IE中应用浏览器辅助对象,你必须用IEAdBlocker.AdBlock对象的类标识符(CLSID)在注册表的HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer/Browser Help Objects路径下建立一个新键值。在编译完代码后,你就可以在注册表的HKEY_CLASSES_ROOT/IEAdBlocker.AdBlock/Clsid条目下找到这个类标识符。

这些代码并不能完全解决问题。这一方法只简单的表明哪些功能对IE和浏览器辅助对象有效。如果你勇于挑战,你可以探索对C++开发者有效的功能来钻研IE;精明的用户甚至可以建立揭露对IE有效的其他界面所必需的类型库,如IdownloadManager。该例子的源代码可从以下地址下载:http://www.phillipweb.com/Nov04/adblock.zip

注意:编辑注册表存在风险,在修改注册表之前,一定要备份注册表。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫郢剑侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值