相关知识:
- 把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数”
- SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数:
- 参数的设定:
string strCmd = "SELECT AccountID FROM Account WHERE AccountName=@AccountName AND password=@password";
对于SQL Server数据库,“@”是参数的前缀。上句中定义了两个参数:@AccountName,@password。
- 在执行命令前给参数赋值:
SqlCommand cmd = new SqlCommand(strCmd, conn); cmd.Parameters.AddWithValue("@AccountName", userName); cmd.Parameters.AddWithValue("@password", password); cmd.ExecuteReader();
- 参数的设定:
- 可以看出,SQL中的参数就跟平常函数中的参数一样,先声明,后赋值。在执行SQL命名时,将会把参数值当成一个字符串整体来进行处理,即使参数值中包含单引号,也会把单引号当成单引号字符,而不是字符串的起止符。这样就在某种程度上消除了SQL注入攻击的条件。
代码示例:
1 static void Main(string[] args) 2 { 3 string userName = "Joe"; 4 string password = "123456"; 5 6 string strConn = @"server=Joe-PC;database=AccountDBforSQLInjection;uid=sa;pwd=root"; 7 SqlConnection conn = new SqlConnection(strConn); 8 9 string strCmd = "SELECT AccountID FROM Account WHERE AccountName=@AccountName AND password=@password"; 10 SqlCommand cmd = new SqlCommand(strCmd, conn); 11 12 cmd.Parameters.AddWithValue("@AccountName", userName); 13 cmd.Parameters.AddWithValue("@password", password); 14 15 try 16 { 17 conn.Open(); 18 SqlDataReader dr = cmd.ExecuteReader(); 19 if (dr.Read()) 20 { 21 Console.WriteLine("成功"); 22 } 23 else 24 { 25 Console.WriteLine("失败"); 26 } 27 } 28 catch (Exception e) 29 { 30 Console.WriteLine(e); 31 } 32 finally 33 { 34 conn.Close(); 35 } 36 }