一直关注博客园,只看不写不厚道,所以就进园子了!初来乍道,先写点自己的一些小小心得!
刚学习C#编程的时候,对数据库进行查询,以下是查询程序部分。
{
con.ConnectionString = " ************************ " ;
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
string classId = " S201 " ;
cmd.CommandText = " SELECT * FROM Student WHERE ClassId = ' " + classId + " ' AND Age > " + age ;
// 省略
}
后来查询语句条件多了,用+来连接感觉看不过来,而且字符串经常容易遗漏单引号,于是就开始用string.Format了。
似乎比以前看起来清晰了些,但总觉得写起来麻烦,特别是字段是字符串的,需要加单引号。于是就在cmd后打了个点(VS自动提示成员),想看看SqlCommand究竟有些其它的东西可用没。发现有个Parameters的属性,什么东西?Baidu Google一番,哈哈,终于找到想要的东西了。于是又进一步改进了查询语句。
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 ,我们把字符串连接起来看看就得到:
如你所见,原来还可以这么写。如果碰上个“心狠手辣”的,在TextBox1中填入 1';DELETE FROM Student;--,我们再看看连接起来的字符串:
第三种写法就是没有被传说的参数化查询,心狠手辣的用户也对之束手无策 :)第三种方法的另外一个好处就是看起来结构很清晰;鄙人后来想往数据库中插图片,都不晓得怎么写语句,后来就用了第三种方式(第一种、第二种没试过插入图片,不晓得行不行)。
第一次写博客园的帖子,,能和大家一起分享自己的心得,虽然很菜鸟,但是如果有初学者能从中的到启发,或者能得到老鸟点拨一二,岂不快哉!