我有一个关于添加参数到一个命令(MySQL或OleDB,我目前使用两个)的问题,以避免SQL注入。OleDB/MySQL参数添加
这个硬编码的查询工作得很好,除了开放的注入漏洞之外;
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;
}
}
}
你的意思是_doesn't work_?你得到任何异常或错误信息?你如何准确地执行你的查询?顺便说一下,不要将密码存储为纯文本。阅读:http://stackoverflow.com/questions/1054022/best-way-to-store-password-in-database –
没有上下文 - 你在你的数据库中存储密码? – Marco
@SonerGönül为了清楚起见,我已通过答复更新。 – CBreeze