如果我在sql查询的变量中删除“'
”字符,则可以避免SQL注入。我使用的SQL查询是:
dbCommand = new OleDbCommand("update Table1 set PhoneNo = '" + phone + "' where Table1.Company = '" + company + "'", dbConnection);
dbCommand.ExecuteNonQuery();
我也以类似的方式使用SELECT sql查询:
dbReader = new OleDbCommand("select * from Table1 where Table1.Company = '" + company + "'", dbConnection).ExecuteReader();
dbReader.Read();
if (dbReader.HasRows)
{
//Do operations using dbReader["Company"]
}
变量中是否还有其他可能导致SQL注入或其他风险的字符?我可以删除那些。有什么其他方法可以防止SQL注入或其他风险?
答案 0 :(得分:5)
最好的方法是使用参数化查询,不要尝试删除任何'
。一个例子是:
dbCommand = new OleDbCommand("update Table1 set PhoneNo = ? where Table1.Company =? ", dbConnection);
dbCommand.Parameters.Add(phone);
dbCommand.Parameters.Add(company);
根据MSDN,OleDbCommand类允许您按名称指定参数。
http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbparametercollection.aspx
所以你可以在我的例子中替换那些?
,实际的参数名如下:
dbCommand = new OleDbCommand("update Table1 set PhoneNo = @phone where Table1.Company =@company ", dbConnection);
dbCommand.Parameters.Add("@phone",phone);
dbCommand.Parameters.Add("@company",company);
更新(史蒂夫评论)
您可以为参数使用名称,但OleDb会忽略它。如果 您更改查询不添加参数的顺序 工作 - 史蒂夫
答案 1 :(得分:0)
尝试将其更改为
dbCommand = new OleDbCommand("update Table1 set PhoneNo = @PhoneNo where Table1.Company = @company ", dbConnection);
dbCommand.Parameters.Add("@PhoneNo", phone );
dbCommand.Parameters.Add("@company", company );