在上一篇文章发表以后不少网友提意见说代码不规范,没有对sql使用参数,这确实是很大一个漏洞,所以我在这里首先谈一下参数化查询问题。
使用参数化查询的好处:可以防止sql注入式攻击,提高程序执行效率。
针对sql server .net data Provider,我们可以使用@作为前缀标记的参数。比如:
const string connStr = "Data source=bineon;user=sa;password=test;initial catalog=northwind;";
string sql = "select ProductID,ProductName from Products";
sql += " where CategoryID = @CategoryID and ProductID < @CategoryID ";
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql,conn);
cmd.Parameters.Add("@CategoryID",CategoryIDValue);
cmd.Parameters.Add("@MaxProductID",MaxProductIDValue);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
上面的代码段在定义sql语句的时候使用了两个参数@CategoryID和@CategoryID。为了是参数在执行过程中获得具体值,我们使用Prarmeter对象,通过它把参数添加到Command对象上,这样就获得参数化查询。
当然上面使用的add方法有其他重载版本,比如我们可以自己定义Parameter对象然后再添加:
SqlParameter para = new SqlParameter("@CategoryID",CategoryIDValue);
cmd.Parameters.Add(para);
上面SqlParameter的构造函数也有多个重载版本。具体可以查看msdn。
注意:上面的参数必须使用@前缀,另外也不仅仅是查询才能使用参数,其他更新数据库的操作类似的都能采用参数。
上面我们给出了针对sql server参数化查询的方法,现在我们讨论在OLEDB 和ODBC中指定参数。
其实这两种Provider都不支持指定参数的方法,但是我们可以在查询中使用(?)作为占位符,去指定参数将出现的位置。
sql = "select ProductID,ProductName from Products";
sql += " where CategoryID =? and ProductID < ?";
接下来我们同样应该把Parameter对象添加到Command的Parameters集合里面,但是这个时候注意参数添加的顺序必须和你使用?的顺序相通,这个是与上面sql server .net data Provider不同的地方。
OleDbCommand cmd = new OleDbCommand(sql,conn);
cmd.Parameters.Add(“CatID”,CategoryIDValue);
cmd.Parameters.Add(“MaxProductID”,MaxProductIDValue);
如果上面添加参数的次序弄反了,那么MaxProductIDValue将被指定到第一个?那里,那么就出错了。另外上面的参数名CatID和MaxProductID无所谓,你怎么命名都可以,甚至是空串也行。
注意:上面参数名无所谓,但是添加参数的次序很重要,不能颠倒。同样的其他更新数据库的操作也支持(?)占位符。
使用参数化查询的好处:可以防止sql注入式攻击,提高程序执行效率。
针对sql server .net data Provider,我们可以使用@作为前缀标记的参数。比如:
const string connStr = "Data source=bineon;user=sa;password=test;initial catalog=northwind;";
string sql = "select ProductID,ProductName from Products";
sql += " where CategoryID = @CategoryID and ProductID < @CategoryID ";
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql,conn);
cmd.Parameters.Add("@CategoryID",CategoryIDValue);
cmd.Parameters.Add("@MaxProductID",MaxProductIDValue);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
上面的代码段在定义sql语句的时候使用了两个参数@CategoryID和@CategoryID。为了是参数在执行过程中获得具体值,我们使用Prarmeter对象,通过它把参数添加到Command对象上,这样就获得参数化查询。
当然上面使用的add方法有其他重载版本,比如我们可以自己定义Parameter对象然后再添加:
SqlParameter para = new SqlParameter("@CategoryID",CategoryIDValue);
cmd.Parameters.Add(para);
上面SqlParameter的构造函数也有多个重载版本。具体可以查看msdn。
注意:上面的参数必须使用@前缀,另外也不仅仅是查询才能使用参数,其他更新数据库的操作类似的都能采用参数。
上面我们给出了针对sql server参数化查询的方法,现在我们讨论在OLEDB 和ODBC中指定参数。
其实这两种Provider都不支持指定参数的方法,但是我们可以在查询中使用(?)作为占位符,去指定参数将出现的位置。
sql = "select ProductID,ProductName from Products";
sql += " where CategoryID =? and ProductID < ?";
接下来我们同样应该把Parameter对象添加到Command的Parameters集合里面,但是这个时候注意参数添加的顺序必须和你使用?的顺序相通,这个是与上面sql server .net data Provider不同的地方。
OleDbCommand cmd = new OleDbCommand(sql,conn);
cmd.Parameters.Add(“CatID”,CategoryIDValue);
cmd.Parameters.Add(“MaxProductID”,MaxProductIDValue);
如果上面添加参数的次序弄反了,那么MaxProductIDValue将被指定到第一个?那里,那么就出错了。另外上面的参数名CatID和MaxProductID无所谓,你怎么命名都可以,甚至是空串也行。
注意:上面参数名无所谓,但是添加参数的次序很重要,不能颠倒。同样的其他更新数据库的操作也支持(?)占位符。