一、SQL注入漏洞
这里举一个简单的例子,在ASP站点的登陆页面中输入以下内容
用户名:admin
密 码:' or ''='
因为
rs.open "select * from userdata where name='"&name&"' and pass='&pass&'"
想必大家都知道这个语句怎么用,但是如果合并上述用户名和密码后,这个SQL语句就是
rs.open "select * from userdata where name='admin' and pass='' or ''=''"
想必大家能看明白是怎么回事情了吧。
那么解决之道便是在执行SQL查询之前对嵌入SQL语句的姓名和密码进行过滤。常用的一个Replace函数为:
Function ReplaceBadChar(strChar)
if strChar="" then
ReplaceBadChar=""
Exit Function
end if
ReplaceBadChar=Replace(ReplaceBadChar,"'","")
ReplaceBadChar=Replace(ReplaceBadChar,"*","")
ReplaceBadChar=Replace(ReplaceBadChar,"?","")
ReplaceBadChar=Replace(ReplaceBadChar,"(","")
ReplaceBadChar=Replace(ReplaceBadChar,")","")
ReplaceBadChar=Replace(ReplaceBadChar,"<","")
ReplaceBadChar=Replace(ReplaceBadChar,">","")
ReplaceBadChar=Replace(ReplaceBadChar,".","")
End Function
这种方法采用的是过滤非法字符,难免有考虑不周全的地方。那么换一个思路:只选择安全字符!
但是我们不愿意为了选择A~Z以及a~z和0~9这些字符写上62条Replace语句或者Instr语句,考虑使用正则表达式变容易的多也简洁得多了:
Function dealUserName(userName)
Dim RegExpObj
Dim resultStr
Set RegExpObj=new RegExp
RegExpObj.Global = True
RegExpObj.Pattern="[^a-zA-Z0-9_]" '只允许字母、数字和下划线
resultStr = RegExpObj.replace(userName,"")
Set RegExpObj=nothing
dealUserName=resultStr
End Function
二、留言版和信息发布
这里里面存在两个问题,一个是留言内容安全性问题,一个留言发布验证码问题。
·留言内容安全性问题
这个问题比那个漏洞能差点,至少你数据能保住。一般设计留言版都直接使用这样的模式:
存:rs("MsgContent")=表单提交信息
取:<%=rs("MsgContent")%>
在感觉上这样是没有什么问题,但是我如果在留言版输入如下代码:
<script language="javascript">while (true){ window.open("程序炸弹地址 /bomb.htm","","fullscreen=yes,Status=no,scrollbars=no,resizable=no");}</script>
最容易想到的解决方法是Replace过滤,但是这并不是一个好的方法,因为过滤或许使得很多内容不能正确显示;
当然采用UBB模式是一个解决途径,这也是网上多数留言系统所兼容的输入模式;
另外一个推荐的方法是使用Server.HTMLEncode()这个函数,可以把用户输入的HTML代码按照原样显示出来,而不会直接执行。
·留言发布验证码问题
!!!验证码成功发布留言后,要重置Session!!!
网上多数验证码采用的模式是产生一个随机字符串,然后存入Session并绘制成图片输出到客户端,这在一定程度上避免了自动发帖机的批量发帖,但是存在这么一个问题:
在发帖成功后使用history.back()或者使用后退返回上级再次点击提交留言仍能再次发布(如果留言板没有重复留言过滤功能的话)!!!
这当然不是我们所想要的,问题根源所在就是在保存了留言之后没有重置Session,导致用户再次同样提交时仍是Session匹配的,此时验证码形同虚设!
除了重置Session、重复留言判断外还有一个方法就是每次页面加载时使用JS脚本重置验证码:
<div id="CheckCode"></div>
<script language="javascript">
window.onload=dealImg;
function dealImg()
{
document.getElementById("CheckCode").innerHTML='<img src="http://sojuker.blog.163.com/blog/checkCode.asp?rand='+ Math.random() +'"/>';
}
</script>
三、FSO图片上传问题
犯这个错误的人已经很少了,不过不表示没有。在上传图片的时候不限制扩展名。
比如我传一个ASP的FSO木马或者通过SHELL执行程序。以及其他方式,就可以完全操控服务器!
四、URL字符串参数安全问题
这个问题的严重级别说大不大说小不小,这要看你传递的参数的重要性了。要知道任何有恶意的人都
可以随便修改URL参数,程序在接收到参数之后是否应该进行严格检查呢?不言而喻。
举个简单例子:
在多数根据ID查询的功能中都是通过URL传递ID值的,而且不加控制就放在了SQL语句中:
rs.open "select * from newsdata where id="&trim(Requst.QueryString("id"))
可想而知,这个问题是多么的严重!!!------cint