通过删除字符和其他可能的方法来防止SQL注入

时间:2013-06-26 20:51:12

标签: c# sql database sql-injection

如果我在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注入或其他风险?

2 个答案:

答案 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 );