网站安全性浅谈

最近有个网友一直在问我什么安全性高的ASP系统。关于网站的安全,我也仅仅是从部分层面有一些体会,今天就分享出来,也作为自己在这方面的一些总结。

这里说明还是以ASP为主。

一、关于漏洞,漏洞修复

这个是关注最多的问题,不管是ASP,PHP还是多高级的语言,漏洞都是无处不在。大多数情况下,漏洞跟开发者有直接或间接的关系。当然,在网站方面,漏洞的主要表现就在参数过滤不严,权限检测不严导致的。

比如前台读取一条新闻,会根据新闻ID这个参数来调用,最初的那些ASP教程里都会这样写

Dim sql,rs
sql="SELECT * FROM NEWS WHERE ID="& Request.QueryString("ID")
Set rs=conn.Execute(sql)

取来的参数不经任何过滤就组装到SQL语句中,只需把参数加些字符,就可实现很多功能

 

'在参数里传入 ID=1 And (SELECT LEN(AdminName) FROM Admin)=5
'SQL语句就成了
SELECT * FROM NEWS WHERE ID=1 And (SELECT LEN(AdminName) FROM Admin)=5
'可以判断管理员名称长度
'在参数里传入 ID=1 And (SELECT Mid(AdminName,2,1) FROM Admin)='a'
'SQL语句就成了
SELECT * FROM NEWS WHERE ID=1 And (SELECT Mid(AdminName,2,1) FROM Admin)='a'
'可以判断某个位置的字符

 

其次是文件上传之类的接口,没经任何验证就直接保存文件,特别是不检测文件名是否合法就以原文件名保存,将直接导致木马文件或后门被上传。

二、修补漏洞的几个层次。

对于一些较早的站长,自己又不大懂得代码的,网站漏洞可是个头疼的问题。网站刚流行的时候,黑客可是个希罕词儿,那时候的网站,也不大注意阻止常规的漏洞,所以,代码中处处都隐藏着类似上面提到的片断,这种网站修补起来很麻烦,网上有些高手于是写了各种通用的防注入程式,其机制就是在代码运行初期,逐个对提交的变量检测(ASP中的Cookie,QueryString,Form),检测的标准一般是基于一些特殊字符(单引号,百分号等)和关键字(select,insert等)。这种做法通常可以起到一定的效果,但同时也有很多不便,比如后台要更新一篇文章,个别时候会出现上述的符号或关键字,就造成文章无法添加,这对用户是非常不友好的。另外,对于文件上传的代码,在调用BinaryRead之前是不能调用Form的,这也会影响到文件上传的模块。这是漏洞修补和第一个层次。

第二个层次,就是在用到外部提交的参数的时候逐一转换或过滤,比如用到数字,就转换int型,用到字符串,如果只需要字母和数字,就把字符串中非字母和数字的过滤掉,然后在组装SQL语句时进行必要的转义。这个层次的主要功夫,就在代码层面,一个Web开发者的水平,也多在这个层面能体现一二。具体代码就不列举了,相信有经验的开发者都有所体会。

第三个层次,就是前年闹的沸沸扬扬的XSS攻击。所谓XSS,全称Cross Site Script,跨站脚本攻击。基本特性就是不直接攻击服务器,而是利用服务器的过滤不严格来构造一些代码,去获取该网站浏览者的隐私信息。在一般的网站后台,很少有考虑到这个问题的,因为后台多是站长自己更新或发布的地方,不会特意去构造XSS代码,所以这种攻击多体现在前台,如一些简单网站的留言板里,如果不对客户的留言内容或其它字段过滤,直接插入到数据库,会导致管理员或其它访客在浏览时遭受跨站攻击,泄漏个人隐私。一般简单的代码是不允许使用html代码,直接对内容进行html编码,这样浏览的时候所有代码都会以原型显示而不会运行。复杂点的方法是针对内容中可能出现脚本或可执行的地方做过滤,尤其是针对IE低版本浏览器,在CSS中都可以运行代码。

代码层面能做到这些,基本上算是比较安全的了,细致的话可以配合上验证码(登录,提交验证,验证过自动刷新),加密(cookie信息加密,验证信息加密)等机制,则可以做到更好。

最后还不要忘记了,除了http协议外还有一个https协议,这是专门用于安全链接的,可防止隐私信息被截获,至于具体使用方法,网络上也有很多介绍。