常见ASP程序的两大漏洞,相信大家已经很清楚它们的形成过程了,那么怎样有效地防治便成为"了我们行文的目的。
易理解性、易测试性和易修改性是衡量一套软件程序可维护性的重要标志。ASP程序同样如此,要想防范ASP程序常见的这几种错误,首先在编写代码的时候就要注意以下两个方面:
1、针对变量未过滤型漏洞
尽量少地取用用户提交的变量数据。对每个带入SQL语句的变量。应该使用rep1ace函数剔除特殊字符,如下所示:
replace(id"'","'")
replace(id,";","''")
replace(id,"(","''")
这样就将变量id中的单引号(')分号(;)、注释符(--)、左括号 (()全部都替换成两个单引号 (")。而且这些替换与判断工作应尽量放在一起,靠近SQL语句,以方便以后的复查工作。特别注意的是,对于字段属性是数字的变量。我们最好还应该使用。cint()或IsNumeric()函数来判断Request得到的数据是否是整数型。如下所示:
If ID""then ID =cint(ID)
If isNumeric(ID)=0 Then ID=0
如果编写的是留言本。或着是论坛的话。还应该考虑到用户发帖的长度,以及用户发帖的时间间隔等问题。
2、针对逻辑错误漏洞
构建良好的程序逻辑结构对于简单的新闻系统来讲,在管理员后台的编写时,所有文件推荐用《admin_"这种特定标记开头,这样方便以后的复查工作。然后专门写一个检查管理员登录的Session变量的文件Session.asp,除开admin_chklogin.asp管理员登录的登录页面,以及检查管理员账号密码,产生登录Session的admin)chklogin.asp以外,其他所有的后台文件都在第一行写入来检查管理员是否登录。
其中,稍微要注意的是验证管理员账号密码,以及产生登录Session的admin_chklogin.asp文件的编写,有的时候管理员就是喜欢使用单引号等特殊字符来做密码,我们当然就不能将这些字符过滤了!而且,为了避免在虚拟机上让其他人有机可乘,Session信息也应该使用变量来设置。笔者的写法如下:
suername=Request.Form("username")
password=request.Form("password")
if username=""or password=""then Response
Redirect("admin_login.asp")
set rs=conn.execute("SELECT top 1 Admin_name,
Admin_password FROM Admin")
Admin_name=rs("Admin_name")
Admin_password=rs("Admin_password")
if(usernameAdmin_name)or(password
Admin_password)then
Response.Redirect"admin_login.asp"
else
Session("Admins")=Admin_name
Response.Redirect"Admin_admin.asp"
end if
rs.close
set rs=nothing
这洋,通过精心的设计整个系统的权限认证过程,就能够基本上杜绝逻辑错误的产生。另外再提一点,不少人喜欢将Admin_login.asp管理员登录界面或管理界面删除或改名,以此防范非法用户登录,实际上这是种错误:第一,ASP程序本就是为了给用户提供方便的操作,不要给自已找麻烦;第二,删除或改名的应该是产生登录session的admin_chklogin.asp文件,不要自欺 欺人,只要能够得到判断管理员的登录信息(比如session或cookies),就可以直接POST数据给后台那些控制数据库操作的文件,登录界面或管理界面都只是摆设而已.
以上都只是根据洞的形成原因,从编写代码的角度来看的。