2012-1-4 9:26:51 补充:还能防采集,哈哈哈哈哈,再说一个猥琐的用法,如果你给自定义的404错误页面中,加入了该保护模块,哈哈哈,强大的效果就来了,可以防止扫目录,如果有扫路径的,瞬间被封IP!!!囧,原理你懂得……
该模块对所有Asp脚本通用,独立运行的,只需要在想保护的页面加上:<!--#include file="Inc/Anti-CC.asp"-->,即可。
脚本规则如下:
1、连续10次访问频率低于1秒的,判定为攻击,封禁IP,这个时间和次数可以自定义,规则放的比较宽,误判几率极低。
2、封禁时间按照攻击频率计算,攻击频率越高,封的越久,如果你在封禁时间段内仍旧访问,那么封禁时间会累积增加,你要是被封了10分钟以上,建议你还是换IP吧,囧……
3、移除掉15分钟内没有访问的用户(时间可自定义)。
由于是高速内存全局变量,不读写文件,不读写数据库,高效查询,所以不必担心会消耗很多资源,实际上只消耗极少的极少的资源,还没你正常访问消耗得多,可忽略不计。
给个查询接口,显示当前所有在线用户:https://lcx.cc/?cc=showuser,如果阈值大于10,那表示是被封的用户,囧……
详细介绍见这里:https://lcx.cc/post/2092/
<%
' Asp 防御CC攻击模块 (Anti-CC)
' Author: Nuclear'Atk
' Creation Date: 2011-12-24 11:55:44
' Last Updated: 2012-6-13 10:13:20
Dim TimeOut, Interval, Anti_CC, IP0, IP1, BrowX, User
TimeOut = 900 '超时时间(秒)
Interval = 1 '最短刷新间隔(秒)
CC_Max = 10 '临界值(次)
IP0 = Request.ServerVariables("REMOTE_ADDR") '客户端代理 IP
IP1 = GetForwarded '绕过代理获取客户端真实 IP (判断用户是否使用了 Http 代理)
BrowX = Replace(Request.ServerVariables("HTTP_USER_AGENT"), vbCrLf, "") '客户端浏览器信息
Application.Lock
If IsEmpty(Application(IP0)) Then '用户第一次访问
Application(IP0) = IP1 & vbCrLf & _
"0" & vbCrLf & _
Now & vbCrLf & _
Now & vbCrLf & _
BrowX & vbCrLf & _
GetFullUrl()
'添加用户信息格式:IP = (绕过代理获取的IP) (阈值) (首次访问) (最后访问) (用户信息) (访问网址)
Else '非第一次访问
User = Split(Application(IP0), vbCrLf) '提取当前用户数据,并分割为数组
If Int(User(1)) >= CC_Max Then '是否被封
If DateDiff("S", User(3), Now) >= Int(User(1)) Then '判断是否需要解封
User(1) = "0"
User(3) = Now
SaveToApp User '保存数据
Else
User(1) = Int(User(1)) + 1 '累加被封时间
SaveToApp User '保存数据
BanIPMsg (User(1) - DateDiff("S", User(3), Now)) '计算解封剩余时间并显示被封信息
End If
Else
If DateDiff("S", User(3), Now) <= Interval Then '判断访问间隔
User(1) = Int(User(1)) + 1 '临界值+1
Else
If Int(User(1)) < 1 Then '处理负数
User(1) = 0
Else
User(1) = Int(User(1)) - 1 '临界值-1
End If
End If
User(3) = Now '刷新最后访问时间
SaveToApp User '保存数据
End If
End If
For Each Anti_CC In Application.Contents '遍历清理超时的用户
User = Split(Application(Anti_CC), vbCrLf) '提取用户数据,并分割为数组
If UBound(User) = 5 Then
If DateDiff("S", User(2), Now) >= TimeOut Then '超时则销毁变量 ' And Int(User(0))<CC_Max
Application.Contents.Remove (Anti_CC)
End If
End If
Next
Application.Unlock
If Request("cc") = "showuser" Then ShowUserList '特权功能:显示在线用户
'-------------------------------------------------------------------------------
Function GetForwarded()
'绕过代理获取真实IP
Dim Tmp
Tmp = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If Len(Tmp) > 0 Then
GetForwarded = Replace(Tmp, vbCrLf, "")
Else
GetForwarded = Request.ServerVariables("REMOTE_ADDR")
End If
End Function
Function GetFullUrl()
'获取完整URL地址
If Request.QueryString <> "" Then
GetFullUrl = "http://" & Request.ServerVariables("HTTP_HOST") & Request.ServerVariables("SCRIPT_NAME") & "?" & Request.QueryString
Else
GetFullUrl = "http://" & Request.ServerVariables("HTTP_HOST") & Request.ServerVariables("SCRIPT_NAME")
End If
GetFullUrl = Replace(GetFullUrl, vbCrLf, "")
End Function
Function SaveToApp(Data)
'保存数据到内存
Application(IP0) = IP1 & vbCrLf & Data(1) & vbCrLf & Data(2) & vbCrLf & User(3) & vbCrLf & BrowX & vbCrLf & GetFullUrl()
End Function
Function BanIPMsg(LeftTime)
'IP 被封时显示的信息
Response.Clear
%>
<p>警告:</P>
<p style="text-indent:2em;">你的访问频率太快,请不要快速刷新页面或者尝试 CC 攻击!</P>
<p style="text-indent:2em;">你的 IP 地址将于 <span style="color: #FF0000" id="tick"><%=LeftTime%></span> 秒后解封,在此期间你不能访问本站任何页面,届时本页面会自动刷新!</P>
<script type="text/javascript">
var i = <%=LeftTime%>;
var intervalid;
intervalid = setInterval("fun()", 1000);
function fun() {
if (i == 0) {
clearInterval(intervalid);
location.reload()
}
document.getElementById("tick").innerHTML = i;
i--
}
</script>
<script>alert('你的访问频率太快,请不要快速刷新页面或者尝试CC攻击!')</script>
<%
Response.End
End Function
Function ShowUserList()
Response.Clear
Response.Write "<meta http-equiv='refresh' content='20'>" & vbCrLf & _
"<body bgcolor='#000000' style='font-size:12px;font-family: Fixedsys;'>" & vbCrLf & _
"<table style='font-size:12px;text-indent:2px;' width='100%' border='1' cellspacing='0' bordercolor='#000000' cellpadding='1'>" & vbCrLf & _
"<tr bgColor='#ACD6FF'>" & _
"<TD width='100'>代理 IP</TD>" & _
"<TD width='100'>真实 IP</TD>" & _
"<TD width='30' align='center'>阈值</TD>" & _
"<TD width='130' align='center'>首次访问</TD>" & _
"<TD width='130' align='center'>最后访问</TD>" & _
"<TD>用户信息</TD>" & _
"<TD>访问网址</TD>" & _
"</tr>" & vbCrLf
Dim TrColor
For Each Anti_CC In Application.Contents '遍历清理超时的用户
User = Split(Application(Anti_CC), vbCrLf) '提取用户数据,并分割为数组
If UBound(User) = 5 Then '判断数据格式是否正确
If TrColor = "#5CADAD" Then '表格自动换色
TrColor = "#95CACA"
Else
TrColor = "#5CADAD"
End If
IF Anti_CC <> User(0) Or Int(User(1)) >= CC_Max Then '高亮显示使用代理、已被屏蔽的用户
TrColor = "#FF9797"
End IF
Response.Write "<tr bgColor='" & TrColor & "' onmouseover=""this.bgColor='#D1E9E9';"" onmouseout=""this.bgColor='" & TrColor & "';"">" & _
"<TD>" & Anti_CC & "</TD>" & _
"<TD>" & Server.HtmlEncode(User(0)) & "</TD>" & _
"<TD align='center'>" & User(1) & "</TD>" & _
"<TD align='center'>" & User(2) & "</TD>" & _
"<TD align='center'>" & User(3) & "</TD>" & _
"<TD>" & Server.HtmlEncode(User(4)) & "</TD>" & _
"<TD>" & Server.HtmlEncode(User(5)) & "</TD>" & _
"</tr>" & vbCrLf
Else '错误的数据
Response.Write "<tr bgColor='#CE0000'>" & _
"<TD>" & Anti_CC & "</TD>" & _
"<TD align='center'>Null</TD>" & _
"<TD align='center'>Null</TD>" & _
"<TD align='center'>Null</TD>" & _
"<TD align='center'>Null</TD>" & _
"<TD>Null</TD>" & _
"<TD>Error: " & Application(Anti_CC) & "</TD>" & _
"</tr>" & vbCrLf
End If
Next
Response.Write "</table>" & vbCrLf & _
"</body>"
Response.End
End Function
%>
留言评论(旧系统):