網(wǎng)站防止CC攻擊的方法
CC攻擊(Challenge Collapsar)是DDOS(分布式拒絕服務(wù))的一種,也是一種常見(jiàn)的網(wǎng)站攻擊方法,攻擊者通過(guò)代理服務(wù)器或者肉雞向向受害主機(jī)不停地發(fā)大量數(shù)據(jù)包,造成對(duì)方服務(wù)器資源耗盡,一直到宕機(jī)崩潰。
CC攻擊的攻擊技術(shù)含量低,利用工具和一些IP代理,一個(gè)初、中級(jí)的電腦水平的用戶就能夠?qū)嵤┕?。不過(guò),如果了解了CC攻擊的原理,那就不難針對(duì)CC攻擊實(shí)施一些有效的防范措施。
通常防止CC攻擊的方法有幾種,一個(gè)是通過(guò)防火墻,另外一些網(wǎng)絡(luò)公司也提供了一些防火墻服務(wù),例如XX網(wǎng)站衛(wèi)士和XX寶,還有一種方法是自己寫程序預(yù)防,昨天網(wǎng)站遇到CC攻擊,這也讓我嘗試了一下各種防止CC攻擊方法的有效性。
一開(kāi)始我想使用某某網(wǎng)站衛(wèi)士來(lái)預(yù)防攻擊,從界面上看,似乎是防止了大量的CC攻擊,但登錄網(wǎng)站后發(fā)現(xiàn),流量依舊異常,攻擊還是依舊,看起來(lái)這個(gè)網(wǎng)站衛(wèi)士的效果并沒(méi)有達(dá)到。
網(wǎng)站防止CC攻擊的方法
從原理上看,基本上所有的防火墻都會(huì)檢測(cè)并發(fā)的TCP/IP連接數(shù)目,超過(guò)一定數(shù)目一定頻率就會(huì)被認(rèn)為是Connection-Flood。但如果IP的數(shù)量足夠大,使得單個(gè)IP的連接數(shù)較少,那么防火墻未必能阻止CC攻擊。
不僅如此,我還發(fā)現(xiàn),啟用了某某網(wǎng)站衛(wèi)士之后,反而更容易被CC攻擊,因?yàn)檫@個(gè)網(wǎng)站衛(wèi)士并不能過(guò)濾掉CC攻擊,攻擊的IP經(jīng)過(guò)其加速后,更換成為這個(gè)網(wǎng)站衛(wèi)士的IP,在網(wǎng)站服務(wù)器端顯示的IP都是相同的,導(dǎo)致服務(wù)器端無(wú)法過(guò)濾這些IP。
實(shí)際上,不使用網(wǎng)站衛(wèi)士類的服務(wù),直接通過(guò)分析網(wǎng)站日志,還是很容易分辨出哪個(gè)IP是CC攻擊的,因?yàn)镃C攻擊畢竟是通過(guò)程序來(lái)抓取網(wǎng)頁(yè),與普通瀏覽者的特性區(qū)別還是很大的,例如普通瀏覽者訪問(wèn)一個(gè)網(wǎng)頁(yè),必定會(huì)連續(xù)抓取網(wǎng)頁(yè)的HTML文件、CSS文件、JS文件和圖片等一系列相關(guān)文件,而CC攻擊者僅僅只會(huì)抓取一個(gè)URL地址的文件,不會(huì)抓取其他類型的文件,其User Agent也大部分和普通瀏覽者不同,這就可以在服務(wù)器上很容易分辨出哪些訪問(wèn)者是CC攻擊了,既然可以判斷出攻擊者的IP,那么預(yù)防措施就很簡(jiǎn)單,只需要批量將這些IP屏蔽,即可達(dá)到防范CC攻擊的目的。
最終,我花了半個(gè)小時(shí)寫了一段小程序,運(yùn)行之后自動(dòng)屏蔽了數(shù)百個(gè)IP,網(wǎng)站才算正常,從而證明,防火墻對(duì)于CC攻擊的防御并不有效,最有效的方法還是在服務(wù)器端通過(guò)程序自動(dòng)屏蔽來(lái)預(yù)防。
看來(lái)CC攻擊的門檻還真低啊,搞個(gè)幾百個(gè)代理或者肉雞就能攻擊別人了,其成本非常低,但效果比較明顯,如果攻擊者流量巨大的話,通過(guò)耗費(fèi)帶寬資源的方式都可以進(jìn)行攻擊。但是,CC攻擊也有明顯的技術(shù)缺陷,就是攻擊者的IP并不是海量的,通常就是幾百數(shù)千的級(jí)別,并且是真實(shí)訪問(wèn)了網(wǎng)站頁(yè)面,這就使得網(wǎng)站可以通過(guò)程序過(guò)濾的方式,輕松獲取到這些攻擊者IP,批量進(jìn)行屏蔽,那么這種CC攻擊就會(huì)得到預(yù)防。
對(duì)于站長(zhǎng)來(lái)說(shuō),通過(guò)程序來(lái)過(guò)濾CC攻擊門檻較高,要有一定的編程技術(shù),因此還是建議使用第三方網(wǎng)站提供的預(yù)防CC的服務(wù),目前主要的網(wǎng)站有:云鎖、安全狗、Cloudflare、百度云加速、360網(wǎng)站衛(wèi)士等。
此外,下面還提供了一段基于ASP的防止CC攻擊的代碼,也供大家參考。
'防止CC攻擊
Dim CC_Info(4),strInfo,strTemp
If Session("CC_Info") = "" Then
CC_Info(0) = "cclog.txt" '日志文件名
CC_Info(1) = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
CC_Info(2) = Request.ServerVariables("REMOTE_ADDR")
CC_Info(3) = 4 'N秒內(nèi)禁止刷新當(dāng)前頁(yè)面
CC_Info(4) = "badip.txt" 'IP黑名單文件名
Session("CC_Info") = CC_Info(0) &"|"& CC_Info(1) &"|"& CC_Info(2) &"|"& CC_Info(3) &"|"& CC_Info(4)
Else
strInfo = Split(Session("CC_Info"),"|")
CC_Info(0) = strInfo(0)
CC_Info(1) = strInfo(1)
CC_Info(2) = strInfo(2)
CC_Info(3) = strInfo(3)
CC_Info(4) = strInfo(4)
End If
Const chkRefresh = 1 '0關(guān)閉防刷新
Const chkProxy = 1 '0關(guān)閉代理驗(yàn)證
Const chkBadIP = 1 '0關(guān)閉IP黑名單
If Session("BadIP") = "" Then
strInfo = ReadFile(CC_Info(4))
If strInfo = "" Then strInfo = "williamlong.info"
Session("BadIP") = strInfo
Else
strInfo = Session("BadIP")
End If
'/*第一層判斷,N秒內(nèi)禁止刷新*/
If chkRefresh = 1 Then
If Session("RefreshTime")="" Then
Session("RefreshTime")=Now()
Else
If DateDiff("s", Session("RefreshTime"), Now()) < CInt(CC_Info(3)) Then
SaveLog CC_Info(0),CC_Info(1) & "["& CC_Info(2) & "]" & Now() &vbCrLf
Response.Write("系統(tǒng)繁忙,請(qǐng)稍候再試!錯(cuò)誤代碼001")
Response.End()
Else
Session("RefreshTime")=Now()
End If
End If
End If
'/*第二層判斷,代理禁止查看*/
If chkProxy = 1 Then
If CC_Info(1) <> "" Then
If InStr(strInfo,CC_Info(1)) = 0 Then
strTemp = CC_Info(1) & vbCrLf
If InStr(strInfo,CC_Info(2)) = 0 Then
strTemp = strTemp & "[" & CC_Info(2) & "]" & vbCrLf
End If
SaveLog CC_Info(4),strTemp
strInfo = strInfo & strTemp
Session("BadIP") = strInfo
End If
'記錄CC攻擊日志
SaveLog CC_Info(0),CC_Info(1) & "["& CC_Info(2) & "]" & Now() &vbCrLf
Response.Write("系統(tǒng)繁忙,請(qǐng)稍候再試!錯(cuò)誤代碼002")
Response.End()
End If
End If
'/*第三層判斷,IP黑名單禁止查看*/
If chkBadIP = 1 Then
If InStr(strInfo,CC_Info(2))>0 Then
Response.Write("系統(tǒng)繁忙,請(qǐng)稍候再試!錯(cuò)誤代碼003")
Response.End()
End If
End If
'ForReading=1,ForWriting=2,ForAppending=8
Function SaveLog(filename, filecontent)
On Error Resume Next
Dim fso, thisfile
filename = Server.MapPath(filename)
Set fso = CreateObject("Scripting.FileSystemObject")
If Err <> 0 Then
Response.Write("寫入文件"&filename&"失敗,可能您的系統(tǒng)不支持FSO!")
Response.End()
End If
Set thisfile = fso.OpenTextFile(filename, 8, True)
thisfile.write (filecontent)
thisfile.Close
Set fso = Nothing
End Function
Function ReadFile(filename)
On Error Resume Next
Dim fso, thisfile
Set fso = CreateObject("Scripting.FileSystemObject")
If Err <> 0 Then
Response.Write("讀取文件"&filename&"失敗,可能您的系統(tǒng)不支持FSO!")
Response.End()
End If
Set thisfile = fso.OpenTextFile(Server.MapPath(filename), 1, True)
ReadFile = thisfile.ReadAll
thisfile.Close
Set thisfile = Nothing
Set fso = Nothing
End Function
來(lái)源:月光博客