.NET中参数化查询数据库
来源:互联网 发布:猫知老鼠四川方言版 编辑:程序博客网 时间:2024/06/05 12:02
一直关注博客园,只看不写不厚道,所以就进园子了!初来乍道,先写点自己的一些小小心得!
刚学习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
后果可想而知。你的产品没上线,你就感谢下这位辣手的“用户”;如果你的产品上线了,那你就想心狠手辣地把谁怎么怎么滴了:)
第三种写法就是没有被传说的参数化查询,心狠手辣的用户也对之束手无策 :)第三种方法的另外一个好处就是看起来结构很清晰;鄙人后来想往数据库中插图片,都不晓得怎么写语句,后来就用了第三种方式(第一种、第二种没试过插入图片,不晓得行不行)。
- .NET中参数化查询数据库
- ASP.NET中参数化查询
- VB6中数据库参数化查询的技巧
- ado.net参数化查询
- [C#] 数据库 参数化 查询
- Asp.net—查询数据库中记录
- .NET to ACCESS的参数化查询
- 关于OLEDB参数化查询【.net】
- ASP.NET 模糊查询参数化
- 使用SqlCommand参数化查询数据库
- C#参数化查询数据库防注入
- 查询数据库系统参数
- ADO.NET中应用大数据量参数化查询的效率分析
- Android 中数据库查询方法query()中的selectionArgs参数解析
- Android 中数据库查询方法 query() 中的参数
- asp.net数据库查询
- Asp.net查询数据库
- ASP.NET查询数据库
- oracle 静默安装
- 【性能专题】Java性能调优
- 九度_题目1522:包含min函数的栈
- [搜索] 理解compass的配置文件
- Android RadioGroup,显示问题
- .NET中参数化查询数据库
- [sftp root@192.168.1.20 << -!] 中 " <<! " 是什麼意思呀
- 模拟和HTML5的ploceholder的效果
- mac下eclipse配置svn的方法
- onbeforeunload与onunload事件
- Hibernate 中的主健 ID 映射配置问题
- win7 mysql数据库安装于vc6.0下数据库调用
- qt录音--raw(pcm)文件转换wav文件
- 普通模式匹配