OleDB / MySQL参数添加

本文关键字:添加 参数 MySQL OleDB | 更新日期: 2023-09-27 18:17:20

我有一个关于添加参数到命令(MySQL或OleDB,我目前使用两者),以避免SQL注入的问题。

这个硬编码查询工作得非常好,除了容易被注入之外;

var queryString = string.Format("SELECT COUNT(*) FROM employs WHERE em_netname = '"+username+"' AND em_password = '"+password+"'");

然而,在修改查询后,我添加了参数而不是让漏洞打开,它不起作用。我是这样做的;

var queryString = string.Format("SELECT COUNT(*) FROM employs WHERE em_netname = @username AND em_password = @password");
OleDbCommand dbfQuery = new OleDbCommand(queryString, dbfCon);
dbfQuery.Parameters.Add("@username", OleDbType.Char).Value = username;
dbfQuery.Parameters.Add("@password", OleDbType.Char).Value = password;

谁能给我一个解释,为什么这是不工作?第一个查询从count返回1,第二个返回0(它应该返回1)。

编辑:为了明确"不工作",我的意思是第一个语句返回1列计数,即有一个用户,查询确实工作。第二个语句,输入完全相同的用户名和密码,返回0,即,尽管用户名和密码组合确实存在(由第一个语句证明),查询不能正确工作。

编辑2:整个类代码发布;

public static bool AuthenticateUser(string username, string password)
    {
        var constr = ConfigurationManager.ConnectionStrings["dbfString"].ConnectionString;           
        using (OleDbConnection dbfCon = new OleDbConnection(constr))
        {
            try
            {
                dbfCon.Open();
                var queryString = string.Format("SELECT COUNT(*) FROM employs WHERE em_netname = @username AND em_password = @password");
                OleDbCommand dbfQuery = new OleDbCommand(queryString, dbfCon);
                dbfQuery.Parameters.Add("@username", OleDbType.Char).Value = username;
                dbfQuery.Parameters.Add("@password", OleDbType.Char).Value = password;
                MessageBox.Show("Query: " + queryString);
                int numOfColumns = Convert.ToInt32(dbfQuery.ExecuteScalar());
                MessageBox.Show(numOfColumns.ToString());
                if (numOfColumns == 1)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (OleDbException)
            {
                throw;
            }
        }
    }

OleDB / MySQL参数添加

根据MSDN, OleDbCommand不支持命名参数。试着用?代替。

当CommandType设置为Text时,OLE DB . net Provider不支持将参数传递给SQL语句或OleDbCommand调用的存储过程的命名参数。在这种情况下,必须使用问号占位符。例如:

SELECT * FROM Customers WHERE CustomerID = ?

因此,OleDbParameter对象添加到OleDbParameterCollection的顺序必须直接对应于命令文本中参数的问号占位符的位置。