赞
踩
避免SQL注入的方法有两种:
一是所有的SQL语句都存放在存储过程中,这样不但可以避免SQL注入,还能提高一些性能,并且存储过程可以由专门的数据库管理员(DBA)编写和集中管理,不过这种做法有时候针对相同的几个表有不同条件的查询,SQL语句可能不同,这样就会编写大量的存储过程,所以有人提出了第二种方案:参数化SQL语句。例如我们在本篇中创建的表UserInfo中查找所有女性用户,那么通常情况下我们的SQL语句可能是这样:
参数化:
优点:不用关心语句的单引号的问题了
,令外可以有效的防止SQL注入的非法入侵,这样写程序在编译的时候就把那语句编译了,不会与其它字符匹配了,这就是防止SQL注入的问题了,
唯一的缺点就是占用系统资源的问题了,因为它是早被预编译好的东西,所以系统在调用的时候是直接使用的,不需要再次进行对SQL语句进行编译了,如果项目小的话,少量的这样的代码可以不用计较资源的问题了
1 | select * from UserInfo where sex=0 |
在参数化SQL语句中我们将数值以参数化的形式提供,对于上面的查询,我们用参数化SQL语句表示为:
1 | select * from UserInfo where sex=@sex |
再对代码中对这个SQL语句中的参数进行赋值,假如我们要查找UserInfo表中所有年龄大于30岁的男性用户,这个参数化SQL语句可以这么写:
1 | select * from UserInfo where sex=@sex and age>@age |
//实例化Connection对象
SqlConnection connection = new SqlConnection("server=localhost;database=pubs;uid=sa;pwd=''");
//实例化Command对象
SqlCommand command = new SqlCommand("select * from UserInfo where sex=@sex and age>@age", connection);
//第一种添加查询参数的例子
command.Parameters.AddWithValue("@sex", true);
//第二种添加查询参数的例子
SqlParameter parameter = new SqlParameter("@age", SqlDbType.Int);//注意UserInfo表里age字段是int类型的
parameter.Value = 30;
command.Parameters.Add(parameter);//添加参数
//实例化DataAdapter
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataTable data = new DataTable();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。