标准的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)若传递的参数为数字,应对传递的参数做合法性判断。 |