一. 防范脚本攻击
JS
脚本
和
HTML
脚本攻击的防范其实很简单:
server.HTMLEncode
(
Str
)完事。当然你还不要大叫,怎么可能?你让我把全站类似<
%=uid%
>都加过滤我还不累死?为了方便的过滤,我们只需要将
HTML
脚本和
JS
脚本中的几个关键字符过滤掉就可以了:程序体(
1
)如下:
‘
以下是过滤函数
<
%
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
%
>
‘
以下是应用实例
<
%=CHK(Username)%
>
Username=CHK(replace(request(“username”),”’”,””))
使用
Include
把函数写在公有页面上,这样效率是最好的。
程序体(
1
)
另外,值得我们注意的是,很多站点在用户注册,或者是用户资料修改的页面上也缺少脚本的过滤,或者是只在其中之一进行过滤,注册进入后修改资料仍然可以进行脚本攻击。对用户提交的数据进行检测和过滤,程序体(
2
)
如下:
‘
以下是过滤函数
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 "
朋友,你的提交用户名含有非法字符,请更改,谢谢合作
<
a href='****:window.history.go(-1);'
>返回<
/a
>
"
response.end
end if
程序体(
2
)
为了提供工作效率我们再将过滤内容程序化,这样对多个参数的过滤效率将有很大程度上的提高:如
程序体(
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
‘
以下是应用实例部分
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
)
有了上面的过滤函数您可以在任何需要过滤的地方应用过滤函数直接使用就可以了。这就使我们的修复工作大大的简化了。
另外,我想在这里再次多提醒一下,一些站点的
UBB
在进行小的表情图标转化时也会出现过滤问题,由于很隐蔽所以不容易发现:
如:
我们标签内的文字进行修改,
不知道各位看懂没,前一个单引号用来中和程序提供的左引号,第二个单引号用来中和闭合的右引号,这样程序输出就为:
<
img src=’img/0001.gif’ onerror=****:alert(); alt=’’
>
如果图片不存在,那么将激活
onerror
标签执行脚本程序。对于已经过滤了单引号的站点在这里用双引号一样可以完成。对于过滤了
****
字段的,只用
alert()
也完全可以。所以说要过滤就要过滤完全,别给攻击者留下一丝机会。