首页 > 代码库 > C#-黑客-数据库访问-字符串的攻击和防御
C#-黑客-数据库访问-字符串的攻击和防御
C#中用基本的方法对数据库进行增删改查,会被黑客利用,写入其他的代码以实现对数据库的数据进行其他的操作。例如:
对下列数据库的某个信息进行修改操作
修改代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; namespace 攻击_防御 { class Program { static void Main(string[] args) { //创建 数据库连接类 SqlConnection conn = new SqlConnection("server=.;database=Data0928;user=sa;pwd=asdf;"); //创建 数据库操作类 SqlCommand cmd = conn.CreateCommand(); //一、显示Users表中的所有信息 cmd.CommandText = "select *from Users"; //在数据库中执行操作 conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) Console.WriteLine(dr["ids"] + "\t" + dr["Username"] + "\t" + dr["password"] + "\t" + dr["nickname"] + "\t" + dr["sex"] + "\t" + dr["birthday"] + "\t" + dr["nation"] + "\t" + dr["class"] + "\t"); conn.Close(); //二、让用户选择要修改的数据 Console.WriteLine(); Console.Write("请输入要修改数据的用户名:"); string uname = Console.ReadLine(); //在数据库查询有无此信息 cmd.CommandText = "select *from Users where username=‘" + uname + "‘"; bool has = false; conn.Open(); SqlDataReader dr1 = cmd.ExecuteReader(); if (dr1.HasRows) has = true; conn.Close(); //提示有无此信息,是否进行修改 if (has) { Console.WriteLine("已查到此用户信息,请输入修改后的信息"); Console.Write("请输入修改的用户名:"); string xname = Console.ReadLine(); Console.Write("请输入修改的密码:"); string xpwd = Console.ReadLine(); Console.Write("请输入修改的昵称:"); string xnick = Console.ReadLine(); Console.Write("请输入修改的性别:"); bool xsex = Convert.ToBoolean(Console.ReadLine()); Console.Write("请输入修改的生日:"); DateTime xbir = Convert.ToDateTime(Console.ReadLine()); Console.Write("请输入修改的民族:"); string xnation = Console.ReadLine(); Console.Write("请输入修改的班级:"); string xcla = Console.ReadLine(); //修改信息准备操作 cmd.CommandText = "update Users set username=‘" + xname + "‘,password=‘" + xpwd + "‘,nickname=‘" + xnick + "‘,sex=‘" + xsex + "‘,birthday=‘" + xbir + "‘,nation=‘" + xnation + "‘,class=‘" + xcla + "‘ where username=‘" + uname + "‘"; //在数据库中执行操作 conn.Open(); int i0 = cmd.ExecuteNonQuery(); conn.Close(); //判断是否修改成功 if (i0 > 0) Console.WriteLine("数据修改成功!"); else Console.WriteLine("数据修改失败!"); } else Console.WriteLine("查无此信息。"); Console.ReadLine(); } } }
修改后数据库数据:
=====================================================================================================
如何对数据库进行字符串攻击?
此时数据库中数据全部被删除,为什么?
在数据库中输入与修改时相同的代码试试
数据库读取到了“delete from Users”字符串,并且它之后的所有代码被“--”注释掉了,并不会执行,所有数据库执行了delete语句,删除了数据库所有信息
=====================================================================================================
针对以上情况,如何防御数据库被修改?——占位符
update Users set 后的语句用占位符代替,比如:set username=‘"+zhangsan+"‘,password=‘"+asdf+"‘ 用set username=@username,password=@password
代替时,等号后面的单引号也去掉
执行cmd.Parameters.Clera();语句清空集合,然后进行添加,指定占位符的意义
再次进行攻击
数据库的结果为
数据库数据并没有删掉,而删除语句作为字符串被占位符带入数据库中,成功防御了字符串的攻击
C#-黑客-数据库访问-字符串的攻击和防御