23.SQL注入漏洞攻防

1.SQL注入漏洞原理

     在实际开发过程中一般是开发人员提供一个界面,允许用户输入用户名和密码,然后程序读取用户输入用户名和密码来构造SQL语句来校验用户名和密码是否正确。这里采用拼接字符串的方式根据用户录入的用户名和密码来构建SQL语句,如果用户名为“guest”,密码为“123456”,那么拼接出来的SQL语句如下:

select (FPassword='123456') AS PwdCorrect  
from T_User 
where FUser='guest' 

     这看起来是没有任何问题的,但是试想如果恶意攻击者在用户名输入框中随意输入一个“abc”,而在密码数据框中输入“1' or '1'='1”,那么拼接出来的SQL语句如下:

select (FPassword='1' or '1'='1') AS PwdCorrect  
from T_User 
where FUser='guest' 

     由于“'1'='1'”这个表达式永远返回true,而true与任何布尔值的or运算的结果都是true,那么无论正确密码是什么“FPassword='1' or '1'='1'”的计算值永远是true,这样恶意攻击者就可以使用任何帐户登录系统了。

     对付SQL注入漏洞有两种方式:过滤敏感字符和使用参数化SQL。

2.过滤敏感字符

     过滤敏感字符的思路非常简单,由于恶意攻击者一般需要在输入框中输入的文本一般含有or、and、select、delete 之类的字符串片段,所以在拼接SQL之前检查用户提交的文本中是否含有这些敏感字符串,如果含有则终止操作。

3.使用参数化SQL 

     C#等语言提供了参数化SQL机制,使用参数化SQL开发人员为在运行时才能确定的参数值设置占位符,在执行的时候再指定这些占位符所代表的值。

public bool InsertAdmin(string userName, string password, string remark, string mail, int departId, int power)
{
        string sql = "insert into S_Admin(UserName,Password,Remark,Mail,DepartId,Power)
values(@UserName,@Password,@Remark,@Mail,@DepartId,@Power)
"; SqlConnection connection = new SqlConnection(); connection.ConnectionString = "";//此处设置链接字符串 SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.Add(
"@UserName",SqlDbType.NVarChar, 60).Value = userName; command.Parameters.Add("@Password", SqlDbType.NVarChar, 60).Value = password; command.Parameters.Add("@Remark", SqlDbType.NVarChar, 60).Value = remark; command.Parameters.Add("@Mail", SqlDbType.NVarChar, 60).Value = mail; command.Parameters.Add("@DepartId", SqlDbType.Int, 4).Value = departId; command.Parameters.Add("@Power", SqlDbType.Int, 4).Value = power;
connection.Open();
int rowsAffected = command.ExecuteNonQuery(); connection.Close(); command.Dispose();
return rowsAffected > 0; }

     在上面的例子中,为运行时才能确定的用户名和密码设置了占位符,然后在运行时再设定占位符的值,在执行时Java、C#会直接将参数化SQL以及对应的参数值传递给DBMS,在DBMS中会将参数值当成一个普通的值来处理而不是将它们拼接到参数化SQL中,因此从根本上避免了SQL注入漏洞攻击。建议开发人员使用参数化SQL来代替字符串拼接,不过如果开发的时候采用的ASP、PHP等语言,那么由于这些语言没有提供参数化SQL机制,因此只能采用其它方式来避免了SQL注入漏洞攻击。

posted on 2012-10-22 15:13  凡一二三  阅读(605)  评论(0编辑  收藏  举报