黑马程序员技术交流社区

标题: SQL注册漏洞 学习日志 [打印本页]

作者: xiaoxiang_04    时间: 2013-2-25 14:05
标题: SQL注册漏洞 学习日志
本帖最后由 xiaoxiang_04 于 2013-2-25 14:12 编辑

之间对数据库连接也有些了解,今天看完杨老师的视频,让我对数据库连接也有了新的认识,最重点的是发现以前的写法是有漏洞的。。。{:soso_e136:}
注册漏洞攻击主要是体现在用户输入恶意数据,通过拼接SQL语句来达到盗取数据的目的。

能被攻击的代码如下。。
string name =TextBox1.Text;\\输入name值
using (SqlConnectioncon = new SqlConnection("Data Source=.;Initial Catalog=lianxi;UserID=sa;Password="))\\数据库连接语句
            {
                con.Open();\\打开数据库
                using(SqlCommand cmd = con.CreateCommand())\\定义SqlCommand对象,用来处理SQL语句
                {
                      cmd.CommandText="select * from message where name=”name”";\\Sql语句
                      using(SqlDataReader reader=cmd.ExecuteReader())\\执行sql语句
                            {
                                while (reader.Read())\\逐条读取数据库中的查询结果
                                {
                                    string name=reader.GetString(2);\\读取第三列的值
                                    MessageBox.Show(name);\\输出值内容
                                }
                            }
                }
            }
   这样运行以后输入相应的name,数据将返回它在数据表中对应第三列数据,虽然看似没有问题,但是对于懂SQL的程序员来说,他可以输入另一种写法来改变SQL语句的本义。之前的SQL 语句是 select * from messagewhere name=”name”‘,假设name值为“哈哈”,那么SQL语句就是select * from message where name=‘哈哈‘,但是如果将输入的name值设置为 1’ or ‘1’=’1,那么数据库所读取的SQL语句就是select * from message where name=1 or  1=1‘,因为1=1‘永远为true那么where语句就会认为条件满足,将会输出数据库中所有想要列的数据(只要修改reader.GetString(2)中的列号就可以了)。

   为了防止注册漏洞攻击,需要以参数的形式来传入输入的参数,这样修改以后就避免了SQL语句的拼接,只会将输入的name值与数据表中的name数据列作比较,比如如果再输入1’ or ‘1’=’1SQL会认为name的值为1’ or ‘1’=’1,并去name列中查找1’ or ‘1’=’1字段,这样就避免了SQL语句拼接,也就是注册漏洞攻击,代码如下

   string name= textBox1.Text;
            
            using(SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=lianxi;UserID=sa;Password=" ))
            {
                con.Open();
                using(SqlCommand cmd = con.CreateCommand())
                {
                   cmd.CommandText = "select* from message where name=@name";\\修改部分
                    cmd.Parameters.Add(new SqlParameter("@name",name)); \\修改部分
                    using(SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            string name1 = reader.GetString(2);
                            MessageBox.Show(name1);
                        }
                        
                    }
                }
            }



如果有不对的地方,欢迎大家批评指正,共同讨论进步~~~{:soso_e138:}



作者: 张少甫    时间: 2013-2-26 11:31
学习了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2