2019.09
1概述
URL (Uniform Resource Locator)即统一资源定位
符,使用数字、字母和符号按一定顺序排列以确定一个
地址,简洁地表示了互联网上资源的位置和访问方法。一个完整的URL 可能包括协议、用户名、密码、域名、端口号、路径、参数、值、标志等多个部分。某些场景下,例如检测恶意链接或是进行数据分析时,首先需要从批量的文本信息中提取出URL。这些URL 往往还存在格式多样、使用别字对抗检测等特点,采用人工提取的方法费时费力。现有的一些提取方法主要存在3个问题:
(1)采用的正则表达式较简单,对短网址、包含
IP 地址、格式特殊或是处在复杂语境中的URL 提取效果不佳;
(2)URL 使用别字或是大小写切换进行对抗
时无法识别;(3)无法进行批量提取。
VBA (Visual Basic for Applications)是一种事件驱
动编程语言,能够扩展微软Office 的应用程序,重复任务的自动化是其最常见的用途之一。VBA 简单易学,使用便捷。由于Office 软件装机量大,几乎在任何电脑上都可直接使用VBA,无需额外搭建环境,与其他语言相比,在处理Excel 文件上有着“天然”的优势。设计了一种基于VBA 语言批量提取URL 的方法,经测试,可以提取多种格式的URL,也可识别使用“点”、“。”或是大小写切换对抗检测的URL。
2
提取方法的设计与实现
2.1提取方法
常见的URL 格式如图1所示,考虑采用正则表达
式匹配的方法。编写函数“getURL”,对待处理文本批量套用函数,将每一条待处理文本作为参数传递,如果匹配正则表达式,则返回匹配的结果;如果不匹配,则
返回空值,方便进一步处理。
2.1.1协议部分结合实际需求,覆盖常见的4种协议:HTTP、HTTPS、
FTP、FTPS。
2.1.2服务器地址部分
设计的正则表达式对服务器地址为域名或IP 地址
类的URL 都可以匹配。服务器地址为域名的至少包含两级域名,最多包含5级域名,且由26个英文字母、数字0至9及符号“-”组成,中间使用符号“.”连接。对于服务器地址为IP 地址的情况,要求匹配正确的IP 地址。2.1.3顶级域名部分
根据互联网名称与数字地址分配机构(ICANN)官
正则匹配 链接 无域名的链接方网站,现有的顶级域名大部分由5个以下的拉丁字符组成。设计正则表达式的相关部分为匹配大小写字母2到5次。这种情况下,未来新注册的一些顶级域名也能被匹配。此处如需对当前不存在的域名加以限制,可根据实际需求修改为顶级域名列表。2.1.4其他部分
URL 中除服务器域名外的部分都可省略,表达式对
于这些部分可匹配0次或多次。
作者简介:上官璐洁(1989-),女,工程师,硕士,研究方向:网络与信息安全、通信。收稿日期:2019-06-07
基于VBA 的批量提取URL 的方法设计与实现
上官璐洁
(国家计算机网络与信息安全管理中心陕西分中心,西安710075)
摘
要:从批量的文本中提取出URL 是开展许多工作的基础,现有的一些工具无法满足复杂需求。基于Excel VBA 易学易用、对运行环境依赖小的特点,提出了使用VBA 语言编程进行数据处理的方法。实际应用表明,该方案代码简单,可以提取多种格式的URL ,也可识别部分对抗检测的URL ,提取的准确率较高,大大提升了工作效率。关键词:VBA 语言;URL 定位;提取;函数
图1常见的URL 格式
必要部分
协议://用户名:密码@服务器地址:端口号/路径/文件名.文件后缀?参数=
值
33
2019.09
测试文本(A1)
提取结果(getURL (A1))
这是一个钓鱼链接点击www.diaoyu 测试www.diaoyu 点www.123456 送888888888www.123456 没有www 的测试342424245 success 342424245 这是一个短网址t/rwfdsda 测试
t/rwfdsda
一串数字号码不会被提取的是吗QQ:123456789少见的顶级域名文本文本p 文本文本p 对抗测试abc。COM。CN abc.COM.CN 对抗测试www 点12345678点cn
www.12345678 带参数长URL 测试s.weibo/weibo/%25E4%25BA%25BA%25E6%25B0%2591%25E7%25BD%2591?topnav =1&wvr=6&b=1s.weibo/weibo/%25E4%25BA%25BA%25E6%25B0%2591%25E7%25BD%2591?topnav=1&wvr=6&b=1端口、用户名、密码测试
username:password@www.g:8080/12213后
干扰
username:pass⁃
word@www.g:8080/12213
密码为空测试username:@www.g:8080/12213username:@www.g:8080/12213
其他协议测试ftp://ftp.seu.edu/ftp://ftp.seu.edu/
高度相似的字符串会被提取吗www.1.3多级域名测试
v/jbyw/cwhy/143756.htm,】v/jbyw/cwhy/143756.htm 符号数字字母干扰23333+LALA123422123333
句号后为数字不会错误提取com。12332连字符干扰yon-网站-33432.122
33432.122
我有两个网站需要提取www.12345 和www.sa⁃
da
www.12345 www.sada
可以提主机名为IP 地址user:pass@192.168.1.2:8080/cdadada user:pass@192.168.1.2:8080/cdadada 不正确的IP 地址不会被提取265.1414.1111.2222
只有字母后加句号后紧跟字母的情况会误提sina.
com。la
sina.la
2.1.5包含多个URL 情况
在VBA 中执行execute 方法返回的是结果集,通过
循环数组的方式可以提取待处理文本中包含的所有URL,中间以空格连接。此处可根据实际需求修改相关代码,提取不同数量的URL,或是使用其他格式存储提取结果。2.1.6对抗检测情况
考虑到提取对抗检测的URL 的需求,对待处理文
本中特定位置的“点”、“。”也进行了匹配,导致部分文本可能会被误提取。若对准确率要求较高,可修改相关代码。
2.2实现核心代码
实现的核心代码如下:
Public Function getURL(text As String)Dim i,str
With CreateObject("VBScript.RegExp").Global =True '全局匹配
.pattern ="((http|https|ftp|ftps):\/\/)?([a-zA-Z0-9-]+:[a-zA-Z0-9-]*@)?"&_
"(([a-zA-Z0-9][-a-zA-Z0-9]{0,62}[\.\u70b9\u3002]){1,4}[a-zA-Z]{2,5}|"&_
"((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d)(\.((25[0-5])|(2[0-4]\d)|"&_
"(1\d\d)|([1-9]\d)|\d)){3})(:\d*)?(\/[\/\+\?\+\.=:&%#_a-zA-Z0-9-]*)?"
If .Test(text)Then '先进行测试,匹配的话就执行,不'匹配的话就返回空值
Set str =.Execute(text)'待处理文本匹配正则表'达式
getURL =str(0).Value
For i =1To str.Count –1'对于存在的多个'URL 全部提取,以空格连接
getURL =getURL +""+str(i).Value Next i
getURL =Replace(getURL,"点",".")'替换掉包'含中文点字的情况
getURL =Replace(getURL,"。",".")'替换掉包'含中文句号的情况Else
getURL =""End If End With End Function
3提取效果测试
设计了一些具有复杂语言环境或是包含不同格式
URL 的文本,来检测该方法的提取效果。测试结果如表1所示。
可以看到,多数情况下,复杂语境中不同类型的URL 都可以被准确提取。但该方法也存在一定的局限性,例如无法提取特殊协议或是使用英文外其他语言的URL。在实际工作中使用该方法对32645条数据进行提取,花费时间1分47秒,准确率达到99.98%,与手工
相比大大提升了工作效率。
4结语
从文本中提取URL 是开展许多工作的基础。由于
URL 格式多样,所处的文本环境也复杂,现有的很多提
取方法不够精确,不能满足实际需求。方案开放、灵活
表1不同文本的提取效果表
34
2019.09
timeout /t 10
goto getIPAddress )
echo %ipstr%
for /f "delims=:tokens=2"%%i in ("%ipstr%")do set ip=%%i
echo %ip%
for /f "delims=.tokens=4"%%i in ("%ip%")do set ip4=%%i
echo %ip4%
其中“:getIPAddress”为标签,自身不执行任何操作,可以使用goto 命令跳转到标签并执行后续的语句。命令“if not defined ipstr()”用来判断是否定义变量ipstr,如果没有定义则执行括号内的命令。括号内命令有两条,第一条为“timeout /t 10”,作用是使批处理等待10秒钟。第二条命令是“goto getIPAddress”,使批处理跳转到getIPAddress 标签之后再次执行。这样就实现了,如果不能获取IP 地址则等待一段时间后重新尝试。
先禁用网卡,执行批处理,等待一段时间后再启用网卡,得到执行结果如图15所示。
第二个问题也可以用标签和goto 命令解决,在循环处理命令“ipconfig”每行的执行结果时只要到匹配“"IPv4"”即可跳出,后面的循环完全没有必要,因此将获取IP 地址部分的批处理修改为如下所示:
echo off
setlocal enabledelayedexpansion :getIPAddress
for /f "delims="%%i in ('ipconfig')do (set str=%%i
if "!str:~0,7!"equ "IPv4"(
set ipstr=%%i goto out ))
if not defined ipstr (timeout /t 10
goto getIPAddress ):out
echo %ipstr%
for /f "delims=:tokens=2"%%i in ("%ipstr%")do set ip=%%i
echo %ip%
for /f "delims=.tokens=4"%%i in ("%ip%")do set ip4=%%i
echo %ip4%
这样在匹配到第一行IPv4也就是第一个获取了IP 地址的网卡时就会跳出循环,计算机的有线网卡一般都排在命令“ipconfig”的第一位。除此之外也可以根据机房实际情况使用for 命令的skip 参数跳过前面的网卡,也可以使用变量计数来选择获得第N 个网卡的IP 地址,还可以在匹配IPv4之前加入匹配网卡名的if 命令达到匹配特定网卡的目的,在此不再赘述。
参考文献
[1]曹永建,祁鹄云,张千千.用批处理程序实现高校
机房复杂软件的自动注册[J].电脑知识与技术,
2009,(24):6915-6916.
[2]蔡志恒.DOS 命令在计算机教学辅助工作中的应用[J].黑龙江科技信息,2010,(8):48-49.
[3]郭毅棋.批处理脚本在高校机房管理中的应用[J].
实验室科学,2011,(1):
145-147.图15
性高,可以根据需求随时修改,提取的准确率较高,大大提升了工作效率。
参考文献
[1]T.Berners-Lee,L.Masinter,M.McCahill.Uniform Re⁃source Locators (URL),RFC1738,December 1994.
[2]Elizabeth Castro.HTML XHTML CSS 基础教程.北京:
人民邮电出版社,2007.
[3]ICANN.DELEGATED STRINGS./en/program-status/delegated-strings,2018
[4]王其松,陈燕珍,王静,徐志远.基于VBA 自动提
取波浪特征值软件的开发[J].中国科技信息,
2014,(1):85-88.
(上接第24页
)
35
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论