我有一個關於添加參數到一個命令(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