最近自己折腾一个数据库的东西,自己研究了一下SQL injection.

SQL injection 看起来还是挺有意思。可以看看youtube 上的一个SQL injection的实例还是比较简单的。http://www.youtube.com/watch?v=MJNJjh4jORY

 

当然这是最基本的SQL injection了。这种最基本的问题一般都出在query的字段连接上。

SqlCommand cmd  =   new  SqlCommand(
  
" SELECT ID, FullName FROM User WHERE Login=' "
  
+  Login.Text
  
+   " ' AND Password=' "  
  
+  Password.Text 
  
+   " ' " );

 

这种类型的错误相当常见,在一般情况下这个SQL语句执行没有任何问题,但是如果往用户的密码框里填上

' OR ''='

那么这个验证就被跳过去了。

当然高级的injecition 需要不停的试最终找到你的sever种这样的bug。 

具体的如何Injection 可以看后面的附件。

下面说一下如何尽可能地防止这种injection的发生:

1输入检查。相信所有的输入都是有害的!对所有接受的输入要检查,对非法数据进行休整使他变得合法(不一定正确).

2. 在编程上最好不要创建非类型安全的动态SQL语句,尽可能使用参数化的查询。

3.对上线的code都要做一个security review. 即使是小的更新也要做security review. 很多安全的漏洞发生在一个小更新上,这个更新太小了以至于让我们等到下次一起review吧。往往问题就出在这样的更新上,千里长堤毁于蚁穴。

4.尽量不要把机密资料以明文的形式存储在数据库中。密码之类的东西最好以单向hash的形式存储 。信用卡信息之类的东西尽量要加密。这样就算你的数据库被攻破了也能保证你的客户资料不会受到损失。

5. 用一些自动化测试来保证你的数据访问层和Web application能够抵御SQL injection的测试用例。这个对于需要经常更新的网站特别重要。能够有效防止你因为一个小的check in 而带来了安全漏洞。

6.不要在出错信息里泄露任何机密。

6.最小权限。确保你的Web application仅能访问必要的表。你的Web Application没有必要访问的表就必须确保他们无法被访问到。另外对于一些表能只给读权限就只给读权限。尽可能地限制Web application的访问权限。

Appendix :
1.SQL injection WhitePaper
2.深入分析SQL注入攻击及安全防范
3.How To: Protect from Form Injection Attacks with ASP.NET
4.How To: Protect from SQL Injection Attacks with ASP.NET