.NET中参数化查询数据库

      一直关注博客园,只看不写不厚道,所以就进园子了!初来乍道,先写点自己的一些小小心得!

  刚学习C#编程的时候,对数据库进行查询,以下是查询程序部分。

using (SqlConnection con =new SqlConnection())
{
  con.ConnectionString ="************************";
  con.Open();
  SqlCommand cmd =new SqlCommand();
  cmd.Connection = con;
  string classId ="S201";
  int age = 15;
  cmd.CommandText ="SELECT * FROM Student WHERE ClassId = '" + classId + "' AND Age >" + age;
  //省略
}

  后来查询语句条件多了,用+来连接感觉看不过来,而且字符串经常容易遗漏单引号,于是就开始用string.Format了。

cmd.CommandText =string.Format("SELECT * FROM Student WHERE ClassId = '{0}' AND Age > {1}",classId, age);

      似乎比以前看起来清晰了些,但总觉得写起来麻烦,特别是字段是字符串的,需要加单引号。于是就在cmd后打了个点(VS自动提示成员),想看看SqlCommand究竟有些其它的东西可用没。发现有个Parameters的属性,什么东西?Baidu Google一番,哈哈,终于找到想要的东西了。于是又进一步改进了查询语句。

cmd.CommandText = "SELECT * FROM Student WHERE ClassId = @chassId AND Age > @age";
cmd.Parameters.Add("classId", SqlDbType.VarChar);
cmd.Parameters.Add("age", SqlDbType.Int);
cmd.Parameters["classId"].Value = classId;
cmd.Parameters["age"].Value = age;

找到了好的方法,那就要数落一下坏的了;)。

  第一种和第二种连接字符串形势的查询语句存在注入漏洞,加入classId是从界面读取,如TextBox1.Text,classId = TextBox1.Text, 如果有用户在TextBox1中填入 1' OR '1'='1 ,我们把字符串连接起来看看就得到:

SELECT * FROM Student WHERE ClassId ='1' OR '1'='1' AND Age >15

      如你所见,原来还可以这么写。如果碰上个“心狠手辣”的,在TextBox1中填入 1';DELETE FROM Student;--,我们再看看连接起来的字符串:

SELECT * FROM Student WHERE ClassId ='1';DELETE FROM Student;--' AND Age >15

      后果可想而知。你的产品没上线,你就感谢下这位辣手的“用户”;如果你的产品上线了,那你就想心狠手辣地把谁怎么怎么滴了:)

  第三种写法就是没有被传说的参数化查询,心狠手辣的用户也对之束手无策 :)第三种方法的另外一个好处就是看起来结构很清晰;鄙人后来想往数据库中插图片,都不晓得怎么写语句,后来就用了第三种方式(第一种、第二种没试过插入图片,不晓得行不行)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值