1

'如果删除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 注入或其他风险?

4

2 回答 2

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 会忽略它。如果您更改添加参数的顺序,则查询不起作用 – Steve

于 2013-06-26T20:54:28.613 回答
0

尝试将其更改为

dbCommand = new OleDbCommand("update Table1 set PhoneNo =  @PhoneNo  where Table1.Company   = @company ", dbConnection);
dbCommand.Parameters.Add("@PhoneNo", phone );
dbCommand.Parameters.Add("@company", company );
于 2013-06-26T20:53:37.190 回答