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

Com*_*ser 0 c# sql database sql-injection

如果我'在sql查询的变量中删除" "字符,则可以避免SQL注入.我使用的SQL查询是:

dbCommand = new OleDbCommand("update Table1 set PhoneNo = '" + phone + "' where Table1.Company = '" + company + "'", dbConnection);
dbCommand.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

我也以类似的方式使用SELECT sql查询:

dbReader = new OleDbCommand("select * from Table1 where Table1.Company = '" + company + "'", dbConnection).ExecuteReader();
dbReader.Read();

if (dbReader.HasRows)
{
    //Do operations using dbReader["Company"]
}
Run Code Online (Sandbox Code Playgroud)

变量中是否还有其他可能导致SQL注入或其他风险的字符?我可以删除那些.有什么其他方法可以防止SQL注入或其他风险?

Ica*_*rus 5

最好的方法是使用参数化查询,不要尝试删除任何'.一个例子是:

dbCommand = new OleDbCommand("update Table1 set PhoneNo = ? where Table1.Company =? ", dbConnection);

dbCommand.Parameters.Add(phone);
dbCommand.Parameters.Add(company);
Run Code Online (Sandbox Code Playgroud)

根据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);
Run Code Online (Sandbox Code Playgroud)

更新(史蒂夫评论)

您可以使用参数的名称,但OleDb会忽略它.如果更改添加参数的顺序,则查询不起作用 - Steve