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

参数化查询,防⽌sql注⼊漏洞参数化查询,防⽌sql注⼊漏洞攻击  这⼏天对于sql注⼊攻击进⾏了详细的研究,在这⾥做⼀下回顾。  ⾸先,什么是注⼊漏洞攻击呢?所谓SQL注⼊,就是通过把SQL命令插⼊到Web表单递交或输⼊域名或页⾯请求的查询字符串,最终达到欺骗服务器执⾏恶意的SQL命令。通常的解决⽅案有过滤敏感字符,⽐如说过滤掉or, and , select sql等关键字,但是,这种⽅法存在⼀定的缺陷,在这⾥不做讨论,我们只看参数化查询解决sql注⼊漏洞的实例。  所谓的参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填⼊数值或数据的地⽅,使⽤参数 (Parameter) 来给值,这个⽅法⽬前已被视为最有效可预防SQL注⼊攻击 (SQL Injection) 的攻击⼿法的防御⽅式。Microsoft SQL Server 的参数格式是以 "@" 字符加上参数名称⽽成,SQL Server 亦⽀持匿名参数 "?"。  例如:SELECT * FROM myTable WHERE myID = @myID INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)或者SELECT * FROM myTable WHERE myID = @myID INSERT INTO myTable (c1, c2, c3, c4) VALUES(?,?,?,?),通过(?)指定占位符,当然在添加参数的时候,必须按照(c1, c2, c3, c4)的顺序来添加,否则会出错。  实例:⼀个简单的登录案例,登录⾸页登录代码如下:

private void btbLogin_Click(object sender, EventArgs e) { String str = @"Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|;Integrated Security=true;User Instance=true";

using (SqlConnection con=new SqlConnection (str)) { try { (); string cmdText = "select Id from T_User where userName='"+ +"' and Password='"++"'"; using (SqlCommand cmd = new SqlCommand(cmdText, con)) { //返回第⼀⾏id的值,如果id>0,则证明登录成功 int i = 32(eScalar()); if (i > 0) { ("Succeed to login the system !"); } else { ("You have input the wrong name or password !"); }

} } catch(Exception ex) { (e); } } }

分析:  数据表T_User中含有⼀条数据,userName为admin,Password为123,这样的话输⼊正确的话能登陆到系统。当⽤户名输⼊admin后,在password⼀栏⾥输⼊ 1’ or ‘1’=’1 之后按登录按钮,惊奇的发现也能登录成功。  原因输出现在这⾥: tring cmdText = "select Id from T_User where userName='"+() +"' andPassword='"+()+"'"; 这是⼀句查询语句,采⽤的是连接字符串的形式。当在sqlserver中输⼊select * from T_User whereuserName='admin' and Password ='1' or '1'='1' 这条语句时, sqlserver是正确执⾏的,也就是返回T_User表中的所有数据。这也就是为什么会发⽣sql注⼊漏洞的原因。所以,⼊侵者只要知道了你的数据表中的任意⼀个⽤户名,就可以登录你的系统,随意更改数据表的资料,造成⽆法弥补的损失,但是,是不是我们没有什么改变⽅法呢?当然不是了,下⾯就来讨论⼀下参数化查询,防⽌sql注⼊,代码如下:private void btbLogin_Click(object sender, EventArgs e) { string str = @"Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|;Integrated Security=true;User Instance=true";

using (SqlConnection con=new SqlConnection (str)) { try { ();    //在查询语句中使⽤参数 string cmdText = "select Id from T_User where userName=@user and Password=@pwd"; using (SqlCommand cmd = new SqlCommand(cmdText, con)) { //设定参数user的值为⽤户输⼊的⽤户名           (new SqlParameter("user",)); //设定参数pwd的值为⽤户输⼊的密码           (new SqlParameter("pwd",)); int i = 32(eScalar()); if (i > 0) { ("Succeed to login the system !"); } else { ("You have input the wrong name or password !"); }

} } catch(Exception ex) { (e); } } }在查询语句中加⼊@user和@pwd这样的参数,然后再为参数赋值,利⽤这样的形式,即可以防⽌该漏洞的发⽣。现在,登录的时候再在password⼀栏⾥输⼊ 1’ or ‘1’=’1 ,就不能够登录了,这样就保证了数据库的安全性。⼩结:参数化查询能够安全⾼效的对sql进⾏条件查询,所以在以后的开发⼯作过程中,尽量使⽤参数化的sql语句,防⽌注⼊漏洞的发⽣。

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

参数化查询,防⽌sql注⼊漏洞参数化查询,防⽌sql注⼊漏洞攻击  这⼏天对于sql注⼊攻击进⾏了详细的研究,在这⾥做⼀下回顾。  ⾸先,什么是注⼊漏洞攻击呢?所谓SQL注⼊,就是通过把SQL命令插⼊到Web表单递交或输⼊域名或页⾯请求的查询字符串,最终达到欺骗服务器执⾏恶意的SQL命令。通常的解决⽅案有过滤敏感字符,⽐如说过滤掉or, and , select sql等关键字,但是,这种⽅法存在⼀定的缺陷,在这⾥不做讨论,我们只看参数化查询解决sql注⼊漏洞的实例。  所谓的参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填⼊数值或数据的地⽅,使⽤参数 (Parameter) 来给值,这个⽅法⽬前已被视为最有效可预防SQL注⼊攻击 (SQL Injection) 的攻击⼿法的防御⽅式。Microsoft SQL Server 的参数格式是以 "@" 字符加上参数名称⽽成,SQL Server 亦⽀持匿名参数 "?"。  例如:SELECT * FROM myTable WHERE myID = @myID INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)或者SELECT * FROM myTable WHERE myID = @myID INSERT INTO myTable (c1, c2, c3, c4) VALUES(?,?,?,?),通过(?)指定占位符,当然在添加参数的时候,必须按照(c1, c2, c3, c4)的顺序来添加,否则会出错。  实例:⼀个简单的登录案例,登录⾸页登录代码如下:

private void btbLogin_Click(object sender, EventArgs e) { String str = @"Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|;Integrated Security=true;User Instance=true";

using (SqlConnection con=new SqlConnection (str)) { try { (); string cmdText = "select Id from T_User where userName='"+ +"' and Password='"++"'"; using (SqlCommand cmd = new SqlCommand(cmdText, con)) { //返回第⼀⾏id的值,如果id>0,则证明登录成功 int i = 32(eScalar()); if (i > 0) { ("Succeed to login the system !"); } else { ("You have input the wrong name or password !"); }

} } catch(Exception ex) { (e); } } }

分析:  数据表T_User中含有⼀条数据,userName为admin,Password为123,这样的话输⼊正确的话能登陆到系统。当⽤户名输⼊admin后,在password⼀栏⾥输⼊ 1’ or ‘1’=’1 之后按登录按钮,惊奇的发现也能登录成功。  原因输出现在这⾥: tring cmdText = "select Id from T_User where userName='"+() +"' andPassword='"+()+"'"; 这是⼀句查询语句,采⽤的是连接字符串的形式。当在sqlserver中输⼊select * from T_User whereuserName='admin' and Password ='1' or '1'='1' 这条语句时, sqlserver是正确执⾏的,也就是返回T_User表中的所有数据。这也就是为什么会发⽣sql注⼊漏洞的原因。所以,⼊侵者只要知道了你的数据表中的任意⼀个⽤户名,就可以登录你的系统,随意更改数据表的资料,造成⽆法弥补的损失,但是,是不是我们没有什么改变⽅法呢?当然不是了,下⾯就来讨论⼀下参数化查询,防⽌sql注⼊,代码如下:private void btbLogin_Click(object sender, EventArgs e) { string str = @"Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|;Integrated Security=true;User Instance=true";

using (SqlConnection con=new SqlConnection (str)) { try { ();    //在查询语句中使⽤参数 string cmdText = "select Id from T_User where userName=@user and Password=@pwd"; using (SqlCommand cmd = new SqlCommand(cmdText, con)) { //设定参数user的值为⽤户输⼊的⽤户名           (new SqlParameter("user",)); //设定参数pwd的值为⽤户输⼊的密码           (new SqlParameter("pwd",)); int i = 32(eScalar()); if (i > 0) { ("Succeed to login the system !"); } else { ("You have input the wrong name or password !"); }

} } catch(Exception ex) { (e); } } }在查询语句中加⼊@user和@pwd这样的参数,然后再为参数赋值,利⽤这样的形式,即可以防⽌该漏洞的发⽣。现在,登录的时候再在password⼀栏⾥输⼊ 1’ or ‘1’=’1 ,就不能够登录了,这样就保证了数据库的安全性。⼩结:参数化查询能够安全⾼效的对sql进⾏条件查询,所以在以后的开发⼯作过程中,尽量使⽤参数化的sql语句,防⽌注⼊漏洞的发⽣。