本帖最后由 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’=’1,SQL会认为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:}
|