时间:2021-07-01 10:21:17 帮助过:33人阅读
2.要查询的原SQL语句。
3.注入的SQL语句
分析示例: 原SQL语句
select COUNT(*) from T_Users where UserName = ‘a‘ and Password =‘b‘1
语义:要查找(用户名为‘a’,密码为‘b’) 的用户总共有几个. 查询结果为1
注入后的SQL语句select COUNT(*) from T_Users where UserName = ‘a‘ and Password = ‘b‘ or 1=1 --‘1
注入后的语义:查找 (密码是a的,并且用户名是b的,) 或者1=1 的所有用户的数量。 这时候语义发生了改变,查询结果为4
分析:如果用户在输入密码时, 输入的不是b 而是b’ or 1=1- - ,语义将会发生改变,(- -在数据库中是注释的标记)最后查询的结果当然也就不相同了。原语句的查询结果为1,注入后的查询结果为4。 SQL注入的危害 我们刚刚示范了SQL注入带来的查询结果的改变,这个可能会让别有用心的用户熟知我们数据库中的记录条数。或者如果输入的是b’ delect T_Users - - 这时候我们整张表都被删除了,这个带来的后果可想而知。 防止SQL注入–参数化查询 我们的机房重构中D层一直在用参数化查询,但是我当时没有完全理解用参数化查询的用意。直到现在才理解了为什么要用参数化查询和参数化查询如何防止SQL注入的。public int checkUser(Users user)
{
string sql = "select COUNT(*) from T_Users where UserName = @UserName and Password = @Password";
SqlParameter[] paras ={new SqlParameter ("@UserName",User.username) ,
new SqlParameter ("@Password",User.password)};
int num = sqlhelper.ExecuteNonQuery(sql, paras);
return num ;
}12345678
这是我们用了参数化查询后的效果,我们来分析一下参数化查询是如何防止sql注入的。
SQL注入与参数化查询
标签:div 重用 数据库 选项 必须 ash http 记录 函数