一. 防范腳本攻擊
JS
腳本
和
HTML
腳本攻擊的防范其實(shí)很簡(jiǎn)單:
server.HTMLEncode
(
Str
)完事。當(dāng)然你還不要大叫,怎么可能?你讓我把全站類似<
%=uid%
>都加過濾我還不累死?為了方便的過濾,我們只需要將
HTML
腳本和
JS
腳本中的幾個(gè)關(guān)鍵字符過濾掉就可以了:程序體(
1
)如下:
‘
以下是過濾函數(shù)
<
%
function CHK(fqyString)
fqyString = replace(fqyString, "
>
", "
>
")
fqyString = replace(fqyString, "
<
", "
<
")
fqyString = replace(fqyString, "&#", "&")
fqyString = Replace(fqyString, CHR(32), " ")
fqyString = Replace(fqyString, CHR(9), " ")
fqyString = Replace(fqyString, CHR(34), """)
fqyString = Replace(fqyString, CHR(39), "'")
fqyString = Replace(fqyString, CHR(13), "")
fqyString = Replace(fqyString, CHR(10) & CHR(10), "
<
/P
><
P
>
")
fqyString = Replace(fqyString, CHR(10), "
<
BR
>
")
CHK = fqyString
end function
%
>
?
‘
以下是應(yīng)用實(shí)例
<
%=CHK(Username)%
>
Username=CHK(replace(request(“username”),”’”,””))
使用
Include
把函數(shù)寫在公有頁(yè)面上,這樣效率是最好的。
程序體(
1
)
另外,值得我們注意的是,很多站點(diǎn)在用戶注冊(cè),或者是用戶資料修改的頁(yè)面上也缺少腳本的過濾,或者是只在其中之一進(jìn)行過濾,注冊(cè)進(jìn)入后修改資料仍然可以進(jìn)行腳本攻擊。對(duì)用戶提交的數(shù)據(jù)進(jìn)行檢測(cè)和過濾,程序體(
2
)
如下:
‘
以下是過濾函數(shù)
If Instr(request("username"),"=")
>
0 or
Instr(request("username"),"%")
>
0 or
Instr(request("username"),chr(32))
>
0 or
Instr(request("username"),"?")
>
0 or
Instr(request("username"),"&")
>
0 or
Instr(request("username"),";")
>
0 or
Instr(request("username"),",")
>
0 or
Instr(request("username"),"'")
>
0 or
Instr(request("username"),"?")
>
0 or
Instr(request("username"),chr(34))
>
0 or
Instr(request("username"),chr(9))
>
0 or
Instr(request("username"),"")
>
0 or
Instr(request("username"),"$")
>
0 or
Instr(request("username"),"
>
")
>
0 or
Instr(request("username"),"
<
")
>
0 or
Instr(request("username"),"""")
>
0 then
response.write "
朋友,你的提交用戶名含有非法字符,請(qǐng)更改,謝謝合作
<
a href='****:window.history.go(-1);'
>返回<
/a
>
"
response.end
end if
程序體(
2
)
為了提供工作效率我們?cè)賹⑦^濾內(nèi)容程序化,這樣對(duì)多個(gè)參數(shù)的過濾效率將有很大程度上的提高:如
程序體(
3
)
‘
以下為程序主體
dim Bword(18)
Bword(0)="?"
Bword(1)=";"
Bword(2)="
>
"
Bword(3)="
<
"
Bword(4)="-"
Bword(5)="’"
Bword(6)="””"
Bword(7)="&"
Bword(8)="%"
Bword(9)="$"
Bword(10)="'"
Bword(11)=":"
Bword(12)="
"
Bword(13)="("
Bword(14)=")"
Bword(15)="--"
Bword(16)=" chr(9)"
Bword(17)=" chr(34)"
Bword(18)=" chr(32)"
errc=false
‘
以下是應(yīng)用實(shí)例部分
for i= 0 to ubound(Bword)
if instr(FQYs,Bword(i))
<>
0 then
errc=true
end if
next
if errc then
response.write "
<
script language=""****""
>
"
response.write "parent.alert('
很抱歉
!
您的操作違法了
);"
response.write "history,back();"
response.write "
<
/script
>
"
response.end
end if
程序體(
3
)
有了上面的過濾函數(shù)您可以在任何需要過濾的地方應(yīng)用過濾函數(shù)直接使用就可以了。這就使我們的修復(fù)工作大大的簡(jiǎn)化了。
另外,我想在這里再次多提醒一下,一些站點(diǎn)的
UBB
在進(jìn)行小的表情圖標(biāo)轉(zhuǎn)化時(shí)也會(huì)出現(xiàn)過濾問題,由于很隱蔽所以不容易發(fā)現(xiàn):
如:
我們標(biāo)簽內(nèi)的文字進(jìn)行修改,
不知道各位看懂沒,前一個(gè)單引號(hào)用來中和程序提供的左引號(hào),第二個(gè)單引號(hào)用來中和閉合的右引號(hào),這樣程序輸出就為:
<
img src=’img/0001.gif’ onerror=****:alert(); alt=’’
>
如果圖片不存在,那么將激活
onerror
標(biāo)簽執(zhí)行腳本程序。對(duì)于已經(jīng)過濾了單引號(hào)的站點(diǎn)在這里用雙引號(hào)一樣可以完成。對(duì)于過濾了
****
字段的,只用
alert()
也完全可以。所以說要過濾就要過濾完全,別給攻擊者留下一絲機(jī)會(huì)。