2023年6月21日发(作者:)

C#使⽤参数化SQL语句之前实现的窗体,我们在⽤户名和密码框中都输⼊1‘ or ‘1’=1’,如下图所⽰。单击“登录“按钮后,你会发现竟然也能进⼊主窗体!我们输⼊的名户名和密码并不正确,为何也能进⼊系统呢?登录成功后,显⽰的主窗体,如下图:这就涉及到了“SQL注⼊攻击”问题。我们在程序中存在着⼤量拼接产⽣SQL语句的代码,这就会导致⼀个⽐较⼤的安全隐患,容易遭受SQL注⼊攻击。就这个窗体例⼦来说,我们在代码中⽤的SQL语句是:string sqlStr = "select * from [Users] where UserName='" + ()

+ "'and Password='" + () + "'";在⽤户名、密码框中输⼊1‘ or ‘1’=1’后产⽣的SQL语句为:

select * from [Users] where UserName='1' or '1'='1' and Password='1' or '1'='1⽽‘1’=‘1’永远是正确的。这样,⽤户在不知道合法的⽤户名和密码的情况下,通过构造特殊的SQL语句,就顺利地进⼊了系统,导致我们的⽤户验证模块形同虚设!为了避免这种情况的发⽣,提⾼程序的安全性,需要使⽤参数化SQL语句。在对象模型中执⾏⼀个参数化查询,需要向SqlCommand对象的Parameters集合添加SqlParameter对象。⽣成SqlParameter对象最简单的⽅式是调⽤SqlCommand对象的Parameters集合的AddWithValue⽅法。这⾥⼜学习了⼀个新的对象:SqlParameter,表⽰SqlCommand的参数。使⽤参数化SQL语句的步骤是:1.

定义包含参数的SQL语句,⽤@符号声明参数。2.

为SQL语句中出现的每⼀个参数定义参数对象,并将参数对象加⼊到SqlCommand对象中。3.

给参数赋值,并执⾏SQL语句。所以,修改上⾯的代码为:string sqlStr="select * from [Users] where UserName=@UserName and Password=@Password"然后创建命令对象的代码时,修改为:现在,再次运⾏程序,在⽤户名和密码框中都输⼊‘1 or ’1‘=1’后,会提⽰“⽤户名或密码错误”,这样⽤户就没有办法⾮法登录系统了。

2023年6月21日发(作者:)

C#使⽤参数化SQL语句之前实现的窗体,我们在⽤户名和密码框中都输⼊1‘ or ‘1’=1’,如下图所⽰。单击“登录“按钮后,你会发现竟然也能进⼊主窗体!我们输⼊的名户名和密码并不正确,为何也能进⼊系统呢?登录成功后,显⽰的主窗体,如下图:这就涉及到了“SQL注⼊攻击”问题。我们在程序中存在着⼤量拼接产⽣SQL语句的代码,这就会导致⼀个⽐较⼤的安全隐患,容易遭受SQL注⼊攻击。就这个窗体例⼦来说,我们在代码中⽤的SQL语句是:string sqlStr = "select * from [Users] where UserName='" + ()

+ "'and Password='" + () + "'";在⽤户名、密码框中输⼊1‘ or ‘1’=1’后产⽣的SQL语句为:

select * from [Users] where UserName='1' or '1'='1' and Password='1' or '1'='1⽽‘1’=‘1’永远是正确的。这样,⽤户在不知道合法的⽤户名和密码的情况下,通过构造特殊的SQL语句,就顺利地进⼊了系统,导致我们的⽤户验证模块形同虚设!为了避免这种情况的发⽣,提⾼程序的安全性,需要使⽤参数化SQL语句。在对象模型中执⾏⼀个参数化查询,需要向SqlCommand对象的Parameters集合添加SqlParameter对象。⽣成SqlParameter对象最简单的⽅式是调⽤SqlCommand对象的Parameters集合的AddWithValue⽅法。这⾥⼜学习了⼀个新的对象:SqlParameter,表⽰SqlCommand的参数。使⽤参数化SQL语句的步骤是:1.

定义包含参数的SQL语句,⽤@符号声明参数。2.

为SQL语句中出现的每⼀个参数定义参数对象,并将参数对象加⼊到SqlCommand对象中。3.

给参数赋值,并执⾏SQL语句。所以,修改上⾯的代码为:string sqlStr="select * from [Users] where UserName=@UserName and Password=@Password"然后创建命令对象的代码时,修改为:现在,再次运⾏程序,在⽤户名和密码框中都输⼊‘1 or ’1‘=1’后,会提⽰“⽤户名或密码错误”,这样⽤户就没有办法⾮法登录系统了。