I have a question about adding parameters to a command (MySQL or OleDB, I currently use both) to avoid SQL injection.
This hard coded query works absolutely fine, aside from the open vulnerability to injection;
var queryString = string.Format("SELECT COUNT(*) FROM employs WHERE em_netname = '"+username+"' AND em_password = '"+password+"'");
However, after modifying the query so that I add parameters rather than leave the vulnerability open, it doesn't work. This is how I do it;
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;
Could somebody please give me an explanation as to why this is not working? The first query returns 1 from count, the second returns 0 (it should return 1).
EDIT: For clarity by "doesn't work" I mean that the first statement returns a column count of 1 i.e. there is a user, the query does work. The second statement, with exactly the same username and password entered returns a 0, i.e. although a username and password combination does exist (proven by the first statement) the query is not working correctly.
EDIT 2: Entire class code posted;
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;
}
}
}