`
caobihole
  • 浏览: 953270 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

作者: 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

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

分享到:
评论

相关推荐

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    GCF 谷歌内嵌浏览器框架, 使用此插件,用户可以通过Internet Explorer的用户界面,以Chrome内核的渲染方式浏览网页。Chrome Frame 会把最新版的Chrome Webkit 内核和JavaScript 引擎注入到IE中, IE浏览器将获得...

    CSS网站布局实录 (第二版)PDF版

    4.1 用CSS设计网站导航 4.1.1 横向导航 4.1.2 纵向导航 4.1.3 下拉及多级弹出式菜单 4.1.4 门户网站的导航设计(闪客帝国) 4.2 背景控制 4.2.1 背景颜色 4.2.2 背景图片 4.2.3 背景定位 4.2.4 背景滚动 4.2.5 背景...

    Ext Js权威指南(.zip.001

    7.2.10 使用浏览器存储的代理:ext.data.webstorageproxy、ext.data. sessionstorageproxy和ext.data.proxy.localstorage / 314 7.3 读取和格式化数据 / 315 7.3.1 概述 / 315 7.3.2 数据的转换过程:ext.data....

    JAVA上百实例源码以及开源项目

    得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,使用公钥初始化签名对象,用于...

    ASP.NET2.0高级编程(第4版)1/6

     20.2.1 使用Cache对象 高速缓存数据687  20.2.2 高速缓存依赖性688 20.3 使用SQL Server高速  缓存依赖性694  20.3.1 使数据库支持SQL  Server高速缓存  禁用功能695  20.3.2 使表支持SQL Server 高速缓存...

    江西电大2018秋-计算机应用基础.doc

    A、科学计算 B、自动控制 C、系统仿真 D、辅助设计 15.(5分) 在Google搜索中,输入""和""二个关键词,中间用空格隔开,表示( )。 A、表示搜索与""有关的容 B、表示搜索与""有关的容 C、表示搜索""和""有关的容 D...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    6.5.5 使用向导的导航系统 183 6.5.6 使用Wizard控件的事件 184 6.5.7 使用Wizard控件显示窗体元素 186 6.6 ImageMap服务器控件 189 6.7 小结 191 第7章 验证服务器控件 193 7.1 有效性验证 193 7.2 客户端和...

    JAVA上百实例源码以及开源项目源代码

    得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,使用公钥初始化签名对象,用于...

Global site tag (gtag.js) - Google Analytics