在oracle中防止SQL注入

首先我尝试使用以下代码

strQuery = @"SELECT PASSWORD FROM IBK_USERS where upper(user_id) =upper('" + UserPrefix + "')"; try { ocommand = new OracleCommand(); if (db.GetConnection().State == ConnectionState.Open) { ocommand.CommandText = strQuery; ocommand.Connection = db.GetConnection(); odatareader = ocommand.ExecuteReader(); odatareader.Read(); 

最后我转换了上面的查询,以防止像这样的SQL注入

 strQuery = @"SELECT PASSWORD FROM IBK_USERS where upper(user_id) =upper(:UserPrefix)"; try { ocommand = new OracleCommand(); if (db.GetConnection().State == ConnectionState.Open) { ocommand.CommandText = strQuery; ocommand.Connection = db.GetConnection(); ocommand.Parameters.Add(":UserPrefix",OracleDbType.Varchar2,ParameterDirection.Input); ocommand.Parameters[":UserPrefix"].Value = UserPrefix; odatareader = ocommand.ExecuteReader(); 

但这不起作用

删除参数名称前面的冒号。 而不是……

 ocommand.Parameters.Add(":UserPrefix", ...); 

…做这个…

 ocommand.Parameters.Add("UserPrefix", ...); 

同样用于设置参数值。


与您的问题没有直接关系:在WHERE子句中使用upper(user_id)可能需要基于函数的索引才能有效运行。 另外, user_id确实需要是一个字符串 – 你能不能只使它成为整数?