随笔 - 64, 文章 - 0, 评论 - 368, 引用 - 12
数据加载中……

如何构建安全的.net web应用系统

 构建一个安全的系统,这是一个非常庞大的工程。它包括设置网络安全,设置操作系统安全以及应用程序本身的安全性。本文介绍的是有关应用.Net技术如何构建一个安全的Web应用系统。

一 安全涉及的服务

构建一个Web应用系统,肯定要涉及到客户端,iis以及数据库等各个组建。下面这幅图[该图来源:http://msdn2.microsoft.com/en-us/library/aa302415.aspx]很好地反映了web应用程序的整个风貌,左边表示web应用程序设计的组件或服务,右边表示各个组件或服务可以考虑使用的安全方案。
比如在IIS这个环节上,我们可以使用匿名访问或设置其它的验证控制方式,可以设置IP地址和域名限制,也可以设置安全案通讯服务器证书。最新版本的IIS都较上一个IIS版本更好的安全改进。最新的IIS7新增安全性可以阅读http://blogs.iis.net/bhill/archive/2006/08/16/Security-features-in-IIS-7.aspx



二 IIS的设置

如何设置IIS,在最大程度上确保IIS安全呢?
1. 给IIS打好补丁。 每隔一段时间,微软都会发布一些安全更新的补丁,必须及时给您的系统打上这些更新补丁。
2. 更改vs 2005自动生成的web项目的文件存放位置。建立web项目时,vs 2005会自动在C:\Inetpub\wwwroot下创建项目目录,更改这个自动生成的目录,将他放在其他盘下的某个位置,将会增加入侵者找到文档目录的难度。
3. 如采用匿名访问,给匿名用户尽量少的系统权限。
4. 如有必要,给站点设置IP地址限制。
5. 禁用目录浏览项目,阻止恶意用户导航到带有危险工具的目录。
   [站点]->[属性]->[主目录]->[目录浏览]
6. 禁用父路径浏览,以防恶意用户使用MapPath方法浏览父目录。
   [站点]->[属性]->[主目录]->[应用程序配置]->[启用父路径]
7. 删除不必要的IIS虚拟目录


三 Web程序的设置

1. 设置服务器的验证方式
.net 提供了我们三种验证的方式,分别为Windows身份验证,窗体身份验证和.net Passport身份验证。对于这三种验证方式,msdn中的 http://msdn2.microsoft.com/en-us/library/aa302388.aspx 一文已对此作了非常详细的介绍。

2. 加密连接数据库字符串
  不少朋友喜欢将连接数据库字符串直接放在web.config中的<connectionStrings>节点下,如同<add name="SQLConnString" connectionString="Data Source=... User Id=...;Password=....;Initial Catalog=...;" providerName="System.Data.SqlClient"/>其实这样做非常不安全,万一web.config这个文件被非法用 户获取,那么数据库服务器上的数据库及用户名密码信息就会被一览无余,这等于给了非法用户一个防盗门的钥匙。有两中较好的方法加密方法:

方法1:
msdn中有两篇很好的文章分别叙述了如何使用DPAPI和RSA分别给它加密。
Encrypt Configuration Sections in ASP.NET 2.0 Using DPAPI: http://msdn2.microsoft.com/en-us/library/ms998280.aspx
Encrypt Configuration Sections in ASP.NET 2.0 Using RSA: http://msdn2.microsoft.com/en-us/library/ms998283.aspx

方法2:
在windows注册表中新建键值,将SQLConnString加密后的信息存放在该键值上,然后设置某部分用户才有权限去读取注册表中的键值,这不失为一种更为安全的方法。

3.  预防跨站点攻击

何为跨站点攻击?跨站点攻击是恶意教本通过其他站点通过脚本的形式注入系统。
如 view.aspx?stuname=sam 写成view.aspx?stuname=<script>alert('you are attacked!')</script>
这就是一个典型的跨站点攻击。

预防的措施有:

1. 限制输入格式,输入类型,输入长度以及输入字符
 如果你使用asp.net的web控件,可以使用asp.net提供的服务器端验证控件加以验证。如果使用html server端控件,那就需要使用System.Text.RegularExpressons.Regex在服务器端加以验证。
注意,不要仅仅在客户端使用js代码加以验证。因为客户端的js脚本可以轻松地通过禁用教本语言将它忽略。我对客户端的js脚本的理解是,他仅仅帮助改善用户体验。

2. 格式化输出。将输入的内容通过HttpUtility.HtmlEncode处理,这样就不能直接看出输出的内容。

3.  要注意使用一些有潜在危险的html标签,这些标签很容易嵌入一些恶意网页代码。如<img> <iframe><script><frameset><embed><object>< style>等。

4. 预防SQL注入式攻击

何为SQL注入式攻击? 利用SQL语法规则,构建出恶意攻击语句入侵数据库系统。
比如,用户输入了 a'; drop database ***
将原本的select * from user where username = 'a' 构建成了select * from user where username = 'a';drop database *** . 类似这种恶意的攻击后果非常严重,这句话就足以将您的数据库删除!!

预防的措施有:

1. 限制输入格式,输入类型,输入长度以及输入字符
2. 使用带参数的动态SQL语句,或者使用代参数的存储过程。这样程序中代替参数的内容将不被视为可执行的 代码,仅仅是表示一段文本。
3. 限制数据库帐户的权限,坚持帐户最小权限原则。
4. 如有必要,不给程序中连接数据库的帐户操作数据库表的权限。通过建立存储过程,给帐户操作存储过程的权限,通过存储过程实现数据库表的增删查改。


四. 数据库安全设置

对数据库的安全设置内容也非常博大精深,很多公司也有专门的数据库管理员负责数据库的安全。考虑以下几项内容,对数据库的安全一定也有帮助。
1. 及时安装数据库补丁
2. 给帐户设置尽量少的权限。
3. 给sa帐户设置复杂的密码。该密码要包含数字,字母及如!#%等非字母字符,长度要>=8.
4. 按必要删除一些不用的服务,比如终端服务等等。

如何构建安全的.net web应用系统是在是博大精深,当然在不同情形下,对应用程序的安全有不同级别的要求,每个开发人员也应从实际出发,构建符合实际需要的安全的系统。以上是我在实践中积累的一点经验,写出来供大家参考,不当之处,欢迎大家讨论。

如有兴趣,更多更精深的内容也可以阅读http://msdn2.microsoft.com/en-us/library/aa302415.aspx

posted on 2007-02-10 09:29 Ring 阅读(3258) 评论(7)  编辑 收藏 所属分类: B .Net 开发

评论

#1楼    回复  引用  查看    

不错,收藏了!
2007-02-10 15:06 | 青州男孩      

#2楼    回复  引用  查看    

3. 要注意使用一些有潜在危险的html标签,这些标签很容易嵌入一些恶意网页代码。如<img> <iframe><script><frameset><embed><object>< style>等。


能不能对以上的说详细点,什么叫危险的HTML标签
2007-02-10 19:32 | 李.net      

#3楼    回复  引用  查看    

如果是提供HOST服务的话,还需要设置Trust Level,这个很重要。
2007-02-12 10:46 | Jeffrey Zhao      

#4楼    回复  引用    

2. 加密连接数据库字符串
不少朋友喜欢将连接数据库字符串直接放在web.config中的<connectionStrings>节点下,如同<add name="SQLConnString" connectionString="Data Source=... User Id=...;Password=....;Initial Catalog=...;" providerName="System.Data.SqlClient"/>其实这样做非常不安全,万一web.config这个文件被非法用户获取,那么数据库服务器上的数据库及用户名密码信息就会被一览无余,这等于给了非法用户一个防盗门的钥匙。有两中较好的方法加密方法:



在05(或者有防火墙)把一些不需求访问的IP直接禁用掉,我觉得这样做比较好
如果再加上加密可能更好
2007-02-12 12:42 | yi [未注册用户]

#5楼    回复  引用    

@yi
把一些不需求访问的IP直接禁用掉,这是一种很好的方案,我在IIS的设置中第4条也提到. 不过有的应用程序放在公网上,比如网站程序,我们一般就不会禁用IP. :-)
2007-02-12 14:30 | ring [未注册用户]

#6楼    回复  引用    

@Jeffrey Zhao
有道理.
2007-02-12 14:31 | ring [未注册用户]

#7楼 [楼主]   回复  引用  查看    

@李.net
这些标签容易被恶意的用户注入脚本代码。
因为这些标签有诸如src,style,href,lowsrc等属性,都容易注入脚本受到攻击。

可以参照下文描述:

IE IFRAME缓冲溢出漏洞
来源:CNCERT/CC 2004-11-09


安全漏洞CN-VA04-111
发布日期:2004-11-09
漏洞类型:远程系统访问
漏洞评估:高危

受影响版本:

  Internet Explorer 6.0 on Windows XP SP1 (完全修补)
  Internet Explorer 6.0 on Windows 2000 (完全修补)

漏洞描述:

  IE中发现的这个新漏洞是由在处理<IFRAME>HTML标记的某些属性时的边界错误引起。具体地讲,一个叫做SHDOCVW.DLL的负责翻译IFRAME、FRAME和EMBED标记的通用Windows DLL文件受到缓冲溢出攻击的影响。恶意人员通过构造一个恶意的HTML文件,在其<IFRAME>标记中的“SRC”和“NAME”参数包含超长字符串,就可以引发缓冲区溢出攻击。成功利用该漏洞可以执行任意代码。当用户浏览HTML网页或查看HTML格式的邮件时,如果其中包含恶意构造的HTML标记,有可能系统会被恶意人员远程接管。

  另外,使用WebBrowser Active X控件的其它程序也会受到该漏洞的影响,如Outlook、Outlook Express和Lotus Notes等。

  该漏洞非常严重,在网上已发现该漏洞的利用代码。在实验室测试,利用代码可以进一步成为传播性更强的蠕虫。

解决方案:

  Windows XP SP 2不受该漏洞的影响。

  在微软提供全面解决方案之前,请先参考以下意见:

  1.关闭活动脚本和ActiveX控件:

  打开IE安全性设置,分别在Internet区和本地区关闭活动脚本和ActiveX控件将可以阻止该漏洞被利用。有关如何在Internet区关闭活动脚本可在微软网站的“恶意网页脚本FAQ”中查阅,有关保护本地区的信息可参考微软知识库833633号文。Windows XP (目前在 RC1)SP2中包括对IE相关问题的安全升级。  http://www.microsoft.com/technet/.../winxpsp2.mspx

  2.不要点击访问主动提供的链接,不要点击邮件、即时消息、网络论坛或者网络中继聊天频道(IRC)中提供的任何不明链接。

  3.保持更新的反病毒软件能够辨别和防御一些攻击,但是也不能完全依赖于此。

  4.使用别的浏览器

参考信息:

  http://www.finjan.com/SecurityLab/.../alert_show.asp?attack_release_id=114

  http://www.cert.org.cn/articles/...2004070521800.shtml

信息提供者:

  启明星辰积极防御实验室

2007-03-02 17:30 | Ring