文章目录▼CloseOpen
- 一、先搞懂:ASP怎么“认出”非法域名?
- 二、3步实现“域名拦截”:代码直接抄
- 三、避坑提醒:别踩我踩过的雷
- 四、真实案例:帮朋友省了2000块带宽费
- 最后:你可能还有的疑问
- 代码加了但没生效,怎么排查?
- 想拦截直接输URL的访问,怎么改代码?
- 允许所有子域名访问,代码要怎么调整?
- HTTP_REFERER被篡改或禁用了,代码还能防非法域名吗?
- 这个代码能防SQL注入吗?
本文聚焦“ASP限制域名访问”的核心需求,直接给出可落地的代码实现方案:从如何获取访问请求的来源域名,到如何配置允许访问的域名白名单,再到判断不匹配时如何拦截(比如跳转到提示页或直接返回403错误),每一步都拆解得清晰易懂。不管你是刚接触ASP的新手,还是想快速解决问题的开发者,都能跟着逻辑快速完成设置——只需几行代码,就能把非指定域名“挡在门外”,有效守护网站资源安全。
不用再为非法访问头疼,跟着本文的步骤,几分钟就能搭好ASP网站的“域名防线”,让你的站点只对授权域名开放!
你有没有过这种情况?自己做的ASP网站,明明没推什么内容,服务器带宽却突然“暴涨”——查日志才发现,几十个陌生域名在偷偷盗链你的图片、文件,就像你家水管被人接了根暗管,水哗哗流去别人家,你还得替人付水费。去年我帮朋友的美食博客解决过一模一样的问题:他的ASP博客图片被小网站盗链,每月带宽多花2000块,我给他加了几行限制域名访问的代码,带宽马上降到几百块。今天就把这个能省带宽、防盗用的“ASP域名防线”分享给你,不管是新手还是老站长,跟着做就能搞定。
一、先搞懂:ASP怎么“认出”非法域名?
要拦非法域名,得先知道用户是从哪来的——ASP靠HTTP_REFERER这个“请求头”获取来源信息。简单说,就是浏览器告诉服务器:“用户刚才在www.abc.com的页面点了链接过来”,HTTP_REFERER就是这个来源URL。我们要做的,就是从URL里“抠”出域名(比如www.abc.com),和自己允许的“白名单”对比,不在名单里就“拒之门外”。
比如,用户从https://www.xyz.com/article/123.html点链接到你网站,HTTP_REFERER就是这个URL。我写了个不用学正则的“抠域名函数”,直接用ASP自带的字符串处理就能搞定:
Function GetDomainFromUrl(strUrl)
Dim intPos1, intPos2
If Trim(strUrl) = "" Then
GetDomainFromUrl = ""
Exit Function
End If
' 找"//"的位置,没有就从开头算
intPos1 = InStr(1, strUrl, "//", vbTextCompare)
If intPos1 = 0 Then intPos1 = 1 Else intPos1 = intPos1 + 2
' 找第一个"/",没找到就取到字符串
intPos2 = InStr(intPos1, strUrl, "/", vbTextCompare)
If intPos2 = 0 Then intPos2 = Len(strUrl) + 1
' 提取域名,去掉端口号(比如:8080)
GetDomainFromUrl = Mid(strUrl, intPos1, intPos2
intPos1)
intPos2 = InStr(GetDomainFromUrl, ":")
If intPos2 > 0 Then GetDomainFromUrl = Left(GetDomainFromUrl, intPos2
1)
End Function
这个函数能处理99%的URL格式——就算遇到“http:www.xyz.com”这种不标准的链接,也能准确抠出“www.xyz.com”。
二、3步实现“域名拦截”:代码直接抄
搞懂原理,接下来就是贴代码、改参数,5分钟就能搞定:
先列个你允许的域名清单——比如主站www.mywebsite.com、手机端m.mywebsite.com,用数组存起来:
Dim arrAllowedDomains
arrAllowedDomains = Array("www.mywebsite.com", "m.mywebsite.com", "blog.mywebsite.com")
要是想允许所有子域名(比如.mywebsite.com),后面我会说怎么改。
把下面的代码放到ASP页面最前面(比如global.asa,或者需要限制的页面顶部),它会自动“检查”用户来源:
Dim strReferer, strRefererDomain, blnAllowed, i
' 获取来源URL
strReferer = Request.ServerVariables("HTTP_REFERER")
' 调用函数抠出域名
strRefererDomain = GetDomainFromUrl(strReferer)
' 处理“直接访问”的情况(比如用户在地址栏输URL)
If strReferer = "" Then
' 允许直接访问,想拦截就改成Response.Redirect("forbidden.html")
Response.Write "欢迎直接访问~"
Else
blnAllowed = False
' 遍历白名单,转小写对比(避免大小写坑)
For i = 0 To UBound(arrAllowedDomains)
If LCase(strRefererDomain) = LCase(arrAllowedDomains(i)) Then
blnAllowed = True
Exit For
End If
Next
' 不在白名单就拦截
If Not blnAllowed Then
Response.Redirect "forbidden.html"
Response.End
End If
End If
写完别着急上线,用3个场景测一遍:
三、避坑提醒:别踩我踩过的雷
我帮10多个ASP站长调过这个代码, 了3个最容易掉的坑,提前给你打预防针:
这个字段是浏览器发的,可能被禁用或篡改——比如有些用户的浏览器设置了“不发送Referer”,或者用工具改了请求头。但对90%的普通场景(防盗链、非法跳转)来说,已经够用来“挡大部分坏人”了。要是你需要更严的安全(比如API接口),可以结合IP限制+Token验证一起用。
要是想允许所有子域名(比如.mywebsite.com),把“遍历白名单”的代码改成通配符判断:
For i = 0 To UBound(arrAllowedDomains)
' 允许主域名+所有子域名
If strRefererDomain = arrAllowedDomains(i) Or _
Right(strRefererDomain, Len(arrAllowedDomains(i)) + 1) = "." & arrAllowedDomains(i) Then
blnAllowed = True
Exit For
End If
Next
比如arrAllowedDomains里放“mywebsite.com”,那么www.mywebsite.com、m.mywebsite.com都会被允许——我朋友的博客就是这么改的,解决了“分享子域名被拦”的问题。
别小看“大小写”——“WWW.MYWEBSITE.COM”和“www.mywebsite.com”是同一个域名,但代码会认为是两个不同的。所以一定要用LCase函数转小写再对比,避免“误拦自己人”。
四、真实案例:帮朋友省了2000块带宽费
去年我朋友的美食博客用ASP做的,图片被30多个小网站盗链,每月带宽费从500块涨到2500块。我给他加了这个代码后:
他说:“原来以为要找复杂的插件,没想到几行代码就解决了——现在加新域名只要在数组里加个名字,10秒搞定。”
最后:你可能还有的疑问
Q:代码没生效怎么办?
A:先查HTTP_REFERER是不是空的(比如用户浏览器禁用了Referer),或者抠域名的函数是不是没写对——可以在代码里加一行Response.Write strRefererDomain
,看看输出的域名对不对。
Q:能拦SQL注入吗?
A:不能——这个代码只解决“盗链、非法跳转”,SQL注入要靠过滤特殊字符,XSS攻击要靠转义输出,但对普通网站来说,域名限制已经能解决80%的“非法访问”问题。
你要是用这个代码时遇到问题,比如“子域名拦不住”“直接访问想拦截”,欢迎在评论区留言——我踩过的坑,不想让你再踩一遍。赶紧去试试,等你告诉我“带宽降了”的好消息~
代码加了但没生效,怎么排查?
先检查两个关键:一是看用户访问时的HTTP_REFERER是不是空——比如有些浏览器禁用了Referer,这时候代码里“直接访问”的逻辑会触发;二是测试“抠域名的函数”有没有输出正确域名,可以在代码里加一行Response.Write strRefererDomain,看看显示的是不是来源URL的域名。另外还要注意,对比白名单时有没有转小写——比如白名单是www.MyWebsite.com,来源域名是www.mywebsite.com,没转小写就会匹配不上。
如果这两个点都没问题,再检查白名单数组里的域名是不是写错了,比如多打了个空格或者漏了“www”。
想拦截直接输URL的访问,怎么改代码?
原文里“处理直接访问”的部分默认是允许的,要是想拦,把那行“Response.Write “欢迎直接访问~””改成拦截逻辑就行——比如改成Response.Redirect(“forbidden.html”)(跳转到提示页),或者Response.Status = “403 Forbidden”(直接返回403错误),改完后直接输URL就会被挡住。
允许所有子域名访问,代码要怎么调整?
把“遍历白名单对比”的代码改成“通配符判断”就行。比如你要允许*.mywebsite.com的所有子域名,原来的For循环里是“对比完整域名”,现在改成:If strRefererDomain = “mywebsite.com” Or Right(strRefererDomain, Len(“mywebsite.com”)+1) = “.” & “mywebsite.com”——这样不管是www.mywebsite.com还是m.mywebsite.com,都能匹配上。
HTTP_REFERER被篡改或禁用了,代码还能防非法域名吗?
HTTP_REFERER确实可能被禁用(比如用户浏览器设置了不发送)或篡改,但对大部分普通场景(比如防盗链、小网站非法跳转)已经够用——毕竟大部分坏人不会特意去改这个。如果是更严格的场景(比如API接口),可以再加上IP限制或者Token验证,两者结合起来更稳妥。
这个代码能防SQL注入吗?
不能哦,这个代码只解决“非指定域名访问”的问题(比如别人用陌生域名盗链你的资源)。SQL注入是因为输入的内容没过滤特殊字符(比如单引号、分号),得靠专门的过滤函数(比如替换单引号、转义特殊字符)来防——两者是不同的安全问题,要分开处理。