时间:2021-07-01 10:21:17 帮助过:2人阅读
这时我们只要在“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语句
上面示例中使用占位符来标示在程序运行过程中需要动态进行替换的值,通过在SQL文本参数前面加@符号实现。
ADO.Net命令对象使用一个集合保存离散的参数类型(3、4行代码),即Parameters集合。
用户可以添加任意多的参数对象并映射到SQL语句中的占位符(6、7行代码)。
DbType | 获取或设置参数的DbType |
Direction | 获取或设置一个值,该值指示参数是只可输入,只可输出还是双向存储过程返回值参数 |
IsNulllable | 获取或设置一个值,该值指示参数是否接收空值 |
ParameterName | 获取或设置SqlParameter的名称 |
Size | 获取或设置列中数据的最大值 |
SqlDbType | 获取或设置参数的DbType |
Value | 获取或设置该参数的值 |
1 cmd.CommandText="Name";demo
1 cmd.CommandType=CommandType.StoredProcedure;
demo
如果存储过程具有输出参数,在执行存储过程后可以通过再次访问命令对象的参数集合取得输出参数的值
从SQL注入谈数据访问层
标签: