参数化查询(Parameterized Query )是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式。下面将重点总结下Parameter构建的几种常用方法。 说起参数化查询当然最主要的就是如何构造所谓的参数:比如,我们登陆时需要密码和用户名,一般我们会这样写sql语句,Select * from Login where username= @Username and password = @Password,为了防止sql注入,我们该如何构建@Username和@Password两个参数呢,下面提供六种(其实大部分原理都是一样,只不过代码表现形式不一样,以此仅作对比,方便使用)构建参数的方法,根据不同的情况选用合适的方法即可: 说明:以下loginId和loginPwd是户登陆时输入登陆用户名和密码,DB.conn是数据库连接,用时引入using System.Data.SqlClient命名空间 方法一: SqlCommand command = new SqlCommand(sqlStr, DB.conn); command.Parameters.Add("@Username", SqlDbType.VarChar); command.Parameters.Add("@Pasword", SqlDbType.VarChar); command.Parameters["@Username"].Value = loginId; command.Parameters["@Pasword"].Value = loginPwd; 方法二: SqlCommand command = new SqlCommand(); command.Connection = DB.conn; command.CommandText = sqlStr; command.Parameters.Add(new SqlParameter("@Username", loginId)); command.Parameters.Add(new SqlParameter("@Pasword", loginPwd)); 方法三: Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn); cmd.parameters.add("@Username",DbType.varchar).value=loginId; cmd.parameters.add("@Pasword",DbType.varchar).value=loginPwd; 方法四: Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn); cmd.parameters.addwithvalue("@Username",loginId); cmd.parameters.addwithvalue("@Pasword",loginPwd); 方法五: Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn); SqlParameter para1=new SqlParameter("@Username",SqlDbType.VarChar,16); para1.Value=loginId; cmd.Parameters.Add(para1); SqlParameter para2=new SqlParameter("@Pasword",SqlDbType.VarChar,16); para2.Value=loginPwd; cmd.Parameters.Add(para2); 方法六: SqlParameter[] parms = new SqlParameter[] { new SqlParameter(@Username, SqlDbType.NVarChar,20), new SqlParameter(@Pasword, SqlDbType.NVarChar,20), }; SqlCommand cmd = new SqlCommand(sqlStr, DB.conn); // 依次给参数赋值 parms[0].Value = loginId; parms[1].Value = loginPwd; //将参数添加到SqlCommand命令中 foreach (SqlParameter parm in parms) { cmd.Parameters.Add(parm); } (责任编辑:admin) |