从SQL注入谈数据访问层
什么是SQL注入?
SQL注入就是应用程序的开发人员未预期的吧SQL语句传入到应用程序的过程,如果直接使用用户输入的值来构建SQL语句的应用程序是很可能会受到SQL注入攻击的。特别是基于浏览器的网络应用中,SQL注入攻击比较常见。
简单来说就是使用用户输入的值来构建SQL语句比如:
demostring sql="select * from UserBase where Id='"+txtId.text+"' and pwd='"+txtpwd.text+"'"; //使用‘’“”的方式将用户输入的值包裹起来构建SQL语句
这时我们只要在“txtId”这个文本框中输入“ ‘ or 1=1 -- ”这样不管他输入的账号和密码是否正确他都可以成功登陆你的应用程序,甚至还可以用这种方式自己构建SQL语句直接对你的系统级别的数据库进行操作
参数化命令
上面讲述的这种构建SQL语句的方式很容易受到SQL注入的攻击,而使用参数化命令可以有效的防止SQL注入的攻击。
如下:
1 string sql ="select * from UserBase where Id=@Id and pwd=@pwd";//使用占位符来占位 2 //给占位符赋值 3 SqlParameter sp1=new SqlParameter("@Id",txtId.Text); 4 SqlParameter sp2=new SqlParameter("@pwd",txtpwd.Text); 5 //将参数值与Command对象关联 6 cmd.Parameters.Add(sp1); 7 cmd.Parameter.Add(sp2);
上面示例中使用占位符来标示在程序运行过程中需要动态进行替换的值,通过在SQL文本参数前面加@符号实现。
ADO.Net命令对象使用一个集合保存离散的参数类型(3、4行代码),即Parameters集合。
用户可以添加任意多的参数对象并映射到SQL语句中的占位符(6、7行代码)。
SqlParameter类的常用属性
DbType | 获取或设置参数的DbType |
Direction | 获取或设置一个值,该值指示参数是只可输入,只可输出还是双向存储过程返回值参数 |
IsNulllable | 获取或设置一个值,该值指示参数是否接收空值 |
ParameterName | 获取或设置SqlParameter的名称 |
Size | 获取或设置列中数据的最大值 |
SqlDbType | 获取或设置参数的DbType |
Value | 获取或设置该参数的值 |
用ADO.NET调用存储过程
-
在数据端编写存储过程
-
调用存储过程
-
为Command对象指定存储过程名称
1 cmd.CommandText="Name";
-
指定Command对象的命令类型
1 cmd.CommandType=CommandType.StoredProcedure;
-
存储过程返回值
如果存储过程具有输出参数,在执行存储过程后可以通过再次访问命令对象的参数集合取得输出参数的值