防护针对SQL Server数据库的SQL注入攻击

SQL注入可能是最常见的攻击面向InternetSQL Server数据库的方法。即使你对网络和防火墙进行了防护,只要应用程序存在漏洞,那么依然存在受攻击的可能。微软已经注意到最近针对使用ASPASP.NET网站的攻击数量呈上升趋势。这不仅会导致数据的失窃和丢失,在近期的很多案例中数据库中还被攻击者加入恶意javascript代码,这导致访问网站的客户电脑也会因此感染病毒。

 

防护针对您数据库的SQL注入攻击有如下的几种方法:

 

1. 使用双引号

使用双引号或其他符号替换您的用户的输入值。这种简单的预防措施能较为有效的防护相当多的SQL注入攻击。单引号经常被用于结束SQL表达式,使输入的内容获得不必要的权限。

代码如下:

string strSanitizedInput = strInput.Replace("'", "''");

 

注意:请记住即使你已经替换了单引号,攻击者也有可能绕过这个防护措施。

 

2. 避免动态SQL

动态SQL是动态查询的很好的工具,但这也会暴露脆弱点。很多情况下可以使用其他SQL语句或存储过程来代替动态SQL。当然,如果您在存储过程中依然通过用户输入来建立动态SQL查询,那么只靠替换还是不安全的。

 

较好的使用参数的SQL语句如下:

Code

 

使用procVerifyUser存储过程来验证用户是一种更好的方法:

 

Code

 

3. 验证所有的输入

永远不要信任用户的输入。

如果输入域中只能包含数字,那就需要验证用户输入的值是否只包含数字。如果允许输入字符,那么就需要检查是否有允许范围之外的字符。您的应用程序应该包含对诸如分号,等号,冒号,括号和SQL关键字的检查。.NET Framework提供常用的输入检查表达式来简化这个过程。限制用户输入的长度也是一种很好的方法。

您可以使用下列代码来检查输入值限于4-12位的数字,字母和下划线:

[\d_a-zA-Z]{4,12}

 

4. 最低权限原则

永远也不要在代码中用管理员级别权限的帐户来连接数据库。

应用程序使用的帐户应该只拥有应用程序需要的最低级别的权限。这也能将已入侵者造成的破坏降低到最低限度。应用程序不能已sa或其他管理员帐号连接数据库,而且应定义使用的帐号能访问的范围。

 

错误的使用系统管理员权限的代码如下:

<add key="CodeBad"

value="server=localhost;uid=sa;pwd=;database=northwind;" />

 

有限制的正确代码如下:

<add key="CodeGood"

value="server=localhost;uid=NWindReader;pwd=utbbeesozg4d;

database=northwind;" />

 

5. 安全存储机密信息

不要用明文存储机密信息。

较好的替代方法是使用加密或散列密码。散列密码较加密密码更安全,这是因为它们不能被解密。你还可以在散列加密之前添加一些随机值来增加安全性。

好的代码如下:

Code

 

加密的连接字符串在Web.Config中存储如下:

<add key="CodeBest"

value="AQAAANCMnd8BFdERjHoAwE/

Cl+sBAAAAcWMZ8XhPz0O8jHcS1539LAQAAAACAAAAAAADZgAAqAAAABAAAABdodw0YhWfcC6+

UjUUOiMwAAAAAASAAACgAAAAEAAAALPzjTRnAPt7/W8v38ikHL5IAAAAzctRyEcHxWkzxeqbq/

V9ogaSqS4UxvKC9zmrXUoJ9mwrNZ/

XZ9LgbfcDXIIAXm2DLRCGRHMtrZrp9yledz0n9kgP3b3s+

X8wFAAAANmLu0UfOJdTc4WjlQQgmZElY7Z8"

/>

 

6. 适当地处理异常

在您所有的代码中加入异常处理,而且所有的异常应该提供最少量的信息。

对于没有处理的异常,应该确保不能使攻击者获得有用的信息。可以通过设置Web.Config中的debug选项和设置CustomError的模式为"RemoteOnly"

范例:

<compilation defaultLanguage="c#"

    debug="false"

/>

 

<customErrors mode="RemoteOnly"

/>

 

辅助工具:

微软也为管理员提供了几个辅助工具,用于检测,防护和识别可能的脆弱点。

 

检测 - HP Scrawlr

http://www.communities.hp.com/securitysoftware/blogs/spilabs/archive/2008/06/23/finding-sql-injection-with-scrawlr.aspx

 

防护 UrlScan 3.0 Beta

http://learn.iis.net/page.aspx/473/using-urlscan

 

识别 Microsoft Source Code Analyzer for SQL Injection

http://support.microsoft.com/kb/954476

 

更详细的SQL Server最优防护实践信息可参考:

"SQL Server 2005 Security Best Practices - Operational and Administrative Tasks"

http://www.microsoft.com/technet/prodtechnol/sql/2005/sql2005secbestpract.mspx

 

"How To - Protect from Injection Attacks in ASP.NET"

http://msdn.microsoft.com/en-us/library/bb355989.aspx

 

"How To - Protect from SQL Injection in ASP.NET"

http://msdn.microsoft.com/en-us/library/ms998271.aspx

 

"How To - Protect from Cross-Site Scripting in ASP.NET"

http://msdn.microsoft.com/en-us/library/ms998274.aspx

 

"Design Guidelines"

http://msdn.microsoft.com/en-us/library/aa302420.aspx

 

"Arch/Design Inspection"

http://msdn.microsoft.com/en-us/library/aa302421.aspx

 

"Microsoft Security Advisory"

http://www.microsoft.com/technet/security/advisory/954462.mspx

posted @ 2009-02-28 18:27  Dem  阅读(504)  评论(0编辑  收藏  举报