VBA网页抓取安全方法:如何净化响应数据防范恶意代码
VBA网页抓取的安全处理方案
一、先做响应合法性验证
在处理返回内容前,先确认请求本身是安全有效的:
- 检查HTTP状态码,只处理200成功的响应
- 验证返回内容类型,确保是预期的HTML格式
With http .Open "GET", url, False .send ' 验证请求状态 If .Status <> 200 Then MsgBox "请求失败,状态码:" & .Status Exit Sub End If ' 验证内容类型 Dim contentType As String contentType = .getResponseHeader("Content-Type") If InStr(1, contentType, "text/html", vbTextCompare) = 0 Then MsgBox "响应内容不是预期的HTML格式" Exit Sub End If End With
二、净化HTML内容,移除恶意代码
直接把原始响应赋值给innerHTML可能触发恶意脚本,先通过正则移除危险标签,再转义特殊字符:
' 需先引用「Microsoft VBScript Regular Expressions 5.5」 Dim regEx As New RegExp Dim cleanHtml As String Dim rawResponse As String rawResponse = http.responseText ' 移除<script>标签及内部所有内容 regEx.Global = True regEx.IgnoreCase = True regEx.Pattern = "<script[^>]*>[\s\S]*?</script>" cleanHtml = regEx.Replace(rawResponse, "") ' 移除其他危险标签:iframe、embed、object regEx.Pattern = "<(iframe|embed|object)[^>]*>[\s\S]*?</\1>" cleanHtml = regEx.Replace(cleanHtml, "") ' 转义HTML特殊字符(避免后续解析时触发意外执行) regEx.Pattern = "<" cleanHtml = regEx.Replace(cleanHtml, "<") regEx.Pattern = ">" cleanHtml = regEx.Replace(cleanHtml, ">") ' 把净化后的内容赋值给HTML对象 html.body.innerHTML = cleanHtml
三、提取数据时的安全校验
提取href属性时,过滤掉非HTTP/HTTPS的恶意协议链接(比如javascript:、vbscript:):
Set topics = html.getElementsByClassName("sidebar-item-label") Dim str As String Dim isSafeLink As Boolean For i = 1 To topics.Length - 1 str = topics(i).href ' 只保留http/https开头的合法链接 isSafeLink = (InStr(1, str, "http://", vbTextCompare) = 1 Or InStr(1, str, "https://", vbTextCompare) = 1) If Not isSafeLink Then str = "[无效/危险链接] " & str End If ' 字符串分割示例(假设按"/"分割) Dim splitParts() As String splitParts = Split(str, "/") ' 保存到Excel(示例:Sheet1第i行开始) Sheet1.Cells(i, 1).Value = str For j = 0 To UBound(splitParts) ' 给单元格内容加单引号,避免Excel解析为公式 Sheet1.Cells(i, j + 2).Value = "'" & splitParts(j) Next j Next i
额外安全建议
- 限制抓取域名:提前校验目标URL的域名,只允许访问指定站点,防止被重定向到恶意网站
- 启用Excel宏安全:只信任可靠的宏文件,避免恶意代码通过宏执行
- 批量处理时加异常捕获:防止单个异常数据导致程序崩溃,同时记录错误信息
内容的提问来源于stack exchange,提问作者the_floor
相关产品推荐
相关产品推荐

