ADO.NET 占位符(防SQL 注入攻击)
当在添加程序中注入攻击时在控制台应用程序中可以这样写:
请输入编号:U006
请输入用户名:无敌
请输入密码:1234
请输入昵称:呵呵
请输入性别:True
请输入生日:2000-1-1
请输入民族:N004');update Users set PassWord='0000';--
添加成功!
这样,不仅添加成功一条数据,而且数据库中Users表里的所有数据的密码都被修改成了0000。数据被篡改了,数据库被成功注入攻击。
那么我们怎么来防御这种注入攻击呢?
其实很简单,只需要修改下程序,在添加数据的C#语句中使用占位符,把位置占住就可以了。
C#语句:
string nation = Console.ReadLine();
conn.Open();
cmd.CommandText = "insert into Users values(@a,@b,@c,@d,@e,@f,@g)";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@a", ucode);
cmd.Parameters.AddWithValue("@b", username);
cmd.Parameters.AddWithValue("@c", password);
cmd.Parameters.AddWithValue("@d", nickname);
cmd.Parameters.AddWithValue("@e",sex);
cmd.Parameters.AddWithValue("@f", birthday);
cmd.Parameters.AddWithValue("@g", nation);
int count = cmd.ExecuteNonQuery();
conn.Close();
使用@XXX 占位符提前占好位置。
这样这条“N004');update Users set PassWord='0000';--”语句执行时,会被当成一个整体一块被存入列名为Nation(民族)中。
同时程序维护人员也可以在后台清楚的看到这条数据出现的异常~~~