首页 > 代码库 > 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#-黑客-数据库访问-字符串的攻击和防御