多语言展示
当前在线:1432今日阅读:86今日分享:14

什么是sql参数化编程可防止sql注入漏洞

sql语句参数化,是为了让用户的输入更加规范.而且可以避免sql注入漏洞.
工具/原料
1

visual studio

2

sqlserver 2008 r2

方法/步骤
1

首先,我们用Sql server 创建一个geek的数据库.再创建一个'表_登录'以及字段和数据.

2

创建一个C#语言Windows窗体程序.

3

创建一个和我图片差不多的界面. 其中最大的文本框里面放的我们当前执行的sql语句.以便大家更明白什么是SQL注入漏洞以及参数化编程的好处.

4

//以下代码是点击按钮登录之后执行的代码string 连接字符串 = @'server=.;database=geek;Integrated Security=true';            string sql = 'select count(*) from 表_登录 where 用户名='' + textBox_用户名.Text + '' And 密码='' + textBox_密码.Text + '';';            int count;            using (SqlConnection 连接对象 = new SqlConnection(连接字符串))            {                using (SqlCommand 执行对象 = new SqlCommand(sql, 连接对象))                {                    连接对象.Open();                    count = (int)执行对象.ExecuteScalar();                }            }            textBox_sql.Text = sql;            if (count > 0)            {                MessageBox.Show('登录成功');            }            else            {                MessageBox.Show('用户名或密码错误');            }

5

我们先输入错误的账号密码,看一下代码执行结果是登录失败.

6

我们再输入一下正确的帐号和密码是可以登录成功的.

7

select count(*) from 表_登录 where 用户名='sql注入漏洞' And 密码='1' or '1'='1';关键的地方来了,我们这次再输入一个错误的账号和密码,但是软件却可以显示登录成功.大家仔细观察sql语句,就不难发现,这是为什么会出现这样的结果了.sql语句漏洞是非常危险的.  管理员账号泄露,数据库被恶意删除,重要商业资料泄露等.

8

这就是由于用户刻意输入,使字符串拼接的sql语句有了新的意义,和原来的sql语句意义完全不一样了.密码应该是sql的值,但却成为了sql语句的条件.我们要杜绝这种情况,就是要让客户输入的变成值,从而避免发生这种问题!

9

sql注入漏洞攻击总结一下:在你输入数据的时候,不违背你的语法,给你创造出一些新的条件,让你完成另外一些事情.

10

那么我们如何规避这种情况呢?在以前传统的做法是检测用户的输入,过滤替换掉一些敏感的字符,比如单引号,括号.但是这也不能绝对防范.在我们C#中,微软为我们设计了一个SqlParameter类库或者使用数据库的存储过程都可以完美过滤掉.

11

现在我们再把代码修改一下,使用Sqlparameter类库.说穿了,在需要值的地方,用一个参数变量表示,而操作数据库的时候,给这个参数赋值即可.这个参数也肯定不能像上面那种情况,让用户通过一些特殊的输入拼接成了意义完全不同的sql语句.

13

string 连接字符串 = @'server=.;database=geek;Integrated Security=true';            string sql = 'select count(*) from 表_登录 where 用户名=@用户名 and 密码=@密码;';            SqlParameter 参数_用户名 = new SqlParameter('@用户名', textBox_用户名.Text);            SqlParameter 参数_密码 = new SqlParameter('@密码', textBox_密码.Text);            int count;            using (SqlConnection 连接对象 = new SqlConnection(连接字符串))            {                using (SqlCommand 执行对象 = new SqlCommand(sql, 连接对象))                {                    执行对象.Parameters.Add(参数_用户名);                    执行对象.Parameters.Add(参数_密码);                    连接对象.Open();                    count = (int)执行对象.ExecuteScalar();                }            }            textBox_sql.Text = sql;            if (count > 0)            {                MessageBox.Show('登录成功');            }            else            {                MessageBox.Show('用户名或密码错误');            }

14

上面的方法,无论你怎么样输入,肯定不会发生sql注入漏洞.原因就是因为,微软提供给我们的SqlParameter类库里面有一套规则.绝对不会让用户的输入拼接成Sql语句改变其原来的意义.这也是目前我们大部分的做法.

推荐信息