关于ASP编程中安全性问题的解决
方案 1、问题描述 标准的HTML语句或者JAVASCRIPT语句会改变输出结果 例如: 在留言板中,我们在留言内容中打入:
你好 如果你的ASP程序中没有屏蔽html语句,那么就会改变"你好"字体的大小。 又比如: 在输入框中写个 javascript 的死循环:
特大新闻 那么其他查看该留言的客人只要移动鼠标到"特大新闻",上就会使用户的浏览器因死循环而死掉。 解决方法和建议: 编写类似程序时应该做好对此类操作的防范,譬如可以写一段
程序判断客户端的输入,并屏蔽掉所有的
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("kupage/"&;Dir) If Instr(ParentURL,ChildURL)=0 Then StrTemp="
您的提交文件不合法!" Call ShowErrMsg(StrTemp) ‘ShowErrMsg()出错提示过程 End If End Sub 备注:
1
1)使用此过程时,预先要在ChildURL中输入本站域名,注意不能输入IP地址,应为HTTP_REFFERER返回的参 数为域名。 2)传递的参数Dir是当前的文件所在的相对目录路径。 3)如果这个网站有2个或2个以上的域名指向,可以在条件语句上并列一个条件,如果域名51hu也 指向这个IP地址(更多如法炮制),条件语句头可以一下判断: If Instr(ParentURL,ChildURL)=0 and Instr(ParentURL,lcase(“51hu”&;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=AdjustedS
tr &; “[&;-()” 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 "" Response.End End If
2
5.问题描述 ASP程序密码验证问题 例如: 在用户名框中输入任意值,密码框中输入ben' or '1'='1 ,这样就绕过了密码验证,将以数据库中第一个 用户的身份登陆。