对ASP稍有了解都知道,ASP是一门相当容易入门的网络开发语言,但安全性问题却一直是其最大的缺撼,这就造成为什么一些大型及安全性要求较高的网络程序选用其它如PHP,CGI,JSP原因,现在即将到来的ASP.NET时代,安全性是否得以解决了,答案是NO的,不过解决方法却还是有的,其实通过优化程序源码,做好服务器安全设置,就能完全杜绝安全漏洞为你带来的威胁! 

ASP.NET常见安全问题(整理中,以后继续增加) 
一、文件操作漏洞(危险指数:高级) 
ASP时代就可通过在线文件操作程序,借FSO的权限漏洞任意操作不同目录及盘符的文件,其危害性可想而知,ASP.NET时代同样存在,不过不同的是,文件操作已经不再是FSO对象了,而是由System.IO这个名称空间中的文件操作类来完成的了,经测试,国内不少.NET虚拟主机提供商都存在这个问题,您只需在本站下载一个WEB在线文件管理系统,上传至虚拟主机空间,你就能发现竟然可以操作不属至自己虚拟主机空间的目录,站长曾在一.NET虚拟主机空间测试,发现这个空间的将所有网站的用户目录都放www目录下,每个用户对应一个目录,站长本人是aspx目录,但当使用这个文件管理时就发现,操作除了自己的ASPX目录外,还可操作www下所有用户目录,这就造成了极大的安全性漏洞!! 
解决方法: 
因为System.IO作为.NET框架的一部分,我们是不能像禁止FSO对象来禁止System.IO的,同样这也不是一个好方法,在ASP.NET中最好的办法就是设置启动aspnet_wp进程那个用户名"ASPNET"对文件的操作权限(NTFS适用) 

二、SQL语句漏洞(危险指数:高级) 
Sql语句作为国际标准的数据库查询语句,在各种编程环境中得到了广泛的应用。作为一个成熟、稳定的系统,用户登陆和密码验证是必不可少的。站长在平时的编程工作中发现,许多程序员在用sql语句进行用户密码验证时是通过一个类似这样的语句来实现的: 
Sql="Select * from 用户表 where 姓名='"+name+"' and 密码='"+password+"'" 
  其中name和password是存放用户输入的用户名和口令,通过执行上述语句来验证用户和密码是否合法有效。但是通过分析可以发现,上述语句却存在着致命的漏洞。当我们在用户名称中输入下面的字符串时:test'or'1'=1,然后口令随便输入,我们设为aaaa。变量代换后,sql语句就变成了下面的字符串: 
Sql="Select * from 用户表 where 姓名='test'or'1'=1' and 密码='aaaa' 
  我们都知道select语句在判断查询条件时,遇到或(or)操作就会忽略下面的与(and)操作,而在上面的语句中1=1的值永远为true,这意味着无论在密码中输入什么值,均能通过上述的密码验证! 
解决方法: 
ASP.NET中提供了两种方法解决,一是在执行验证之前,对用户输入的用户和密码进行合法性判断,不允许输入单引号、等号等特殊字符。二是用参数化查询,这样语句就变为 
Sql="Select * from 用户表 where 姓名=@Name and 密码=@Pass 
这样就杜绝'字符所造成的漏洞了,这个方法也是最好的解决方法!! 

三、HTML语法漏洞(危险指数:中级) 
HTML语法的危险在ASP.NET同样存在,如果没有对用户发言作出HTML语句过滤,就会让恶意破坏的用户利用html写出js攻击语句,典型如不断开窗口直至死机,win9x死机等!! 
解决方法: 
利用语句将HTML语法加密一下就行了,如:Server.HtmlEncode("用户发言"),也可直接过滤'<>这些HTML语法符号,如果想使用HTML语法的用户不妨用UBB语法代替!