日期:2010-12-12  浏览次数:21082 次

1、问题描述
标准的HTML语句或者javascript语句会改变输出结果
例如:
在留言板中,我们在留言内容中打入:
<font size=10 color=red>你好</font>
如果你的ASP程序中没有屏蔽html语句,那么就会改变"你好"字体的大小。
又比如:
在输入框中写个 javascript 的死循环:
<a herf=http://someurl >特大新闻</a>
 那么其他查看该留言的客人只要移动鼠标到"特大新闻",上就会使用户的浏览器因死循环而死掉。

解决方法和建议:
编写类似程序时应该做好对此类操作的防范,譬如可以写一段程序判断客户端的输入,并屏蔽掉所有的 HTML、 javascript 语句。利用下面函数HtmlEnCode()处理:
Function HtmlEnCode(str)
'替换空格符号
str=Replace(str," "," ")
'替换字符"<",">"
str=Replace(str,"<","<")
str=Replace(str,">",">")
'替换行
str=Replace(str,chr(13),"
")
HtmlEnCode=Str
End Function

2、问题描述
用户COPY下表单后,修改ACTION到指定的URL
例如:
新建一个发布页面,未加入客户端的数据合法性检查代码,若指定表单ACTION到提交页面,则通过你的程序入口,可向数据库输入不合法的数据,或导致数据库出错。

解决方法和建议:
通过下面的过程可以解决:
Sub CheckSubmit(Dir)
Dim ParentURL,ChildURL
'读取上一个跳转页面的地址,并且转换为小写字符窜
ParentURL=lcase(Request.ServerVariables("HTTP_REFERER"))
ChildURL=lcase("http://www.kupage.com/"&Dir)
If Instr(ParentURL,ChildURL)=0 Then
StrTemp="
<li>您的提交文件不合法!"
Call ShowErrMsg(StrTemp) ‘ShowErrMsg()出错提示过程
End If
End Sub
备注:
1)使用此过程时,预先要在ChildURL中输入本站域名,注意不能输入IP地址,应为HTTP_REFFERER返回的参数为域名。
2)传递的参数Dir是当前的文件所在的相对目录路径。
3)如果这个网站有2个或2个以上的域名指向,可以在条件语句上并列一个条件,如果域名www.51hu.com也指向这个IP地址(更多如法炮制),条件语句头可以一下判断:
If Instr(ParentURL,ChildURL)=0 and Instr(ParentURL,lcase(“www.51hu.com”&Dir)) Then

3.问题描述
用输入框修改SQL语句
解决方法和建议:
屏蔽掉’ “ & +等符号,注意当禁止键盘输’”&+等非法符号时,用户还可能用COPY的方法输入;还有一种方法就是用一个转换函数,把非法字符转换为合法,从数据库中取出时再转换回来。
可借鉴如下函数:(在执行SQL命令前对特殊字符进行转换)
Function AdjustedForSQL(adj_str)
Dim AdjustedStr,I
Adj_str=Trim(adj_str)
AdjustedStr=””
If Len(adj_str)>0 Then
For I=1 To Len(adj_str)
Select Case Mid(adj_str,I,1)
Case”[”:
AdjustedStr=AdjustedStr & “[]”
Case “|”:
AdjustedStr=AdjustedStr & “[{-}]”
Case “’”:
AdjustedStr=AdjustedStr & “[&-()”
Case Else:
AdjustedStr=AdjustedStr & Mid(adj_str,I,1)
End Select
Next
End If
AdjustedForSQL=AdjustedStr
End Function

4.问题描述
点击后退反复刷新数据库
例如:
发布页面中,发布完一条信息后点击后退,继续发布,反复操作,会导致系数据库多余无效数据。
解决方法和建议:
可在时间上对下一次数据库操作进行控制:
Session("PutInfo")=Now()
在进行数据库操作时,最好是读取表单变量之前加下一句
If DateAdd("s",30,Session("PutInfo"))>Now() Then
Response.Write "<script language=javascript>alert(""您发布信息的间隔时间不能低于30秒!"");history.back();</script>"
Response.End
End If

5.问题描述
ASP程序密码验证问题
例如:
在用户名框中输入任意值,密码框中输入ben' or '1'='1 ,这样就绕过了密码验证,将以数据库中第一个用户的身份登陆。

解决方法和建议:
1)屏蔽输入框中的符号” ’ ”
2)在用户登录页面对于用户名和密码不要同时加以判断,只对用户名进行判断,根据用户名在数据库中查找是否有与之匹配的密码,再将数据库中的密码与输入框中的内容进行比较

6.问题描述
直接修改浏览器中URL传递的参数值

解决方法和建议:
1)尽量不要在链接中带重要的参数,在接受参数时应对请求人进行权限判断。
2)若传递的参数为数字,应对传递的参数做合法性判断。