黑马程序员技术交流社区
标题: 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’=’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:}
作者: 张少甫 时间: 2013-2-26 11:31
学习了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |