SQL注入可能是最常见的攻击面向Internet的SQL Server数据库的方法。即使你对网络和防火墙进行了防护,只要应用程序存在漏洞,那么依然存在受攻击的可能。微软已经注意到最近针对使用ASP和ASP.NET网站的攻击数量呈上升趋势。这不仅会导致数据的失窃和丢失,在近期的很多案例中数据库中还被攻击者加入恶意javascript代码,这导致访问网站的客户电脑也会因此感染病毒。
防护针对您数据库的SQL注入攻击有如下的几种方法:
1. 使用双引号
使用双引号或其他符号替换您的用户的输入值。这种简单的预防措施能较为有效的防护相当多的SQL注入攻击。单引号经常被用于结束SQL表达式,使输入的内容获得不必要的权限。
代码如下:
string strSanitizedInput = strInput.Replace("'", "''");
注意:请记住即使你已经替换了单引号,攻击者也有可能绕过这个防护措施。
2. 避免动态SQL
动态SQL是动态查询的很好的工具,但这也会暴露脆弱点。很多情况下可以使用其他SQL语句或存储过程来代替动态SQL。当然,如果您在存储过程中依然通过用户输入来建立动态SQL查询,那么只靠替换还是不安全的。
较好的使用参数的SQL语句如下:
使用procVerifyUser存储过程来验证用户是一种更好的方法:
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. 安全存储机密信息
不要用明文存储机密信息。
较好的替代方法是使用加密或散列密码。散列密码较加密密码更安全,这是因为它们不能被解密。你还可以在散列加密之前添加一些随机值来增加安全性。
好的代码如下:
加密的连接字符串在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
防护 – 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