2013-10-29 11 views
0

此功能,因爲我通過用戶ID搜索:從MySQL數據庫中提取記錄只工作了用戶ID,而不是電子郵件

private void showList_Click(object sender, EventArgs e) 
{ 
    int id = 0; 
    for (int i = 0; i <= sqlClient.Count("UserList"); i++) 
    { 
     Dictionary<string, string> dik = sqlClient.Select("UserList", "userid = " + id); 

     var lines = dik.Select(kv => kv.Key + ": " + kv.Value.ToString()); 
     userList.AppendText(string.Join(Environment.NewLine, lines)); 
     userList.AppendText(Environment.NewLine); 
     userList.AppendText("--------------------------------------"); 
     id++; 
    } 
} 

此功能不起作用,因爲我通過電子郵件進行搜索:

private void login_Click(object sender, EventArgs e) 
{ 
    string email = lemail.Text; 
    Dictionary<string, string> dik = sqlClient.Select("UserList", "firstname = " + email); 
    var lines = dik.Select(kv => kv.Key + ": " + kv.Value.ToString()); 
    logged.AppendText(string.Join(Environment.NewLine, lines)); 
} 

這是我單擊登錄按鈕時收到的錯誤消息:

您的SQL語法錯誤;檢查 對應於你的MySQL服務器版本正確的語法使用手動 附近「@ aol.com」在行1

我搜索了在數據庫中的電子郵件「[email protected]」沒有引號。 由於我知道這是一個特殊字符,但我很難相信錯誤信息@符號正在引起衝突,但我很難找出要搜索的詞組來幫助我。

而且,這裏是被調用的函數:

public Dictionary<string, string> Select(string table, string WHERE) 
{ 
    //This methods selects from the database, it retrieves data from it. 
    //You must make a dictionary to use this since it both saves the column 
    //and the value. i.e. "age" and "33" so you can easily search for values. 

    //Example: SELECT * FROM names WHERE name='John Smith' 
    // This example would retrieve all data about the entry with the name "John Smith" 

    //Code = Dictionary<string, string> myDictionary = Select("names", "name='John Smith'"); 
    //This code creates a dictionary and fills it with info from the database. 

    string query = "SELECT * FROM " + table + " WHERE " + WHERE + ""; 

    Dictionary<string, string> selectResult = new Dictionary<string, string>(); 

    if (this.Open()) 
    { 
     MySqlCommand cmd = new MySqlCommand(query, conn); 
     MySqlDataReader dataReader = cmd.ExecuteReader(); 

     try 
     { 
     while (dataReader.Read()) 
     { 
      for (int i = 0; i < dataReader.FieldCount; i++) 
      { 
       selectResult.Add(dataReader.GetName(i).ToString(), dataReader.GetValue(i).ToString()); 
      } 
     } 
     dataReader.Close(); 
     } 
     catch { } 
     this.Close(); 
     return selectResult; 
    } 
    else 
    { 
     return selectResult; 
    } 
} 

我的數據庫表被稱爲 「UserList的」

中的字段順序如下:

用戶ID,電子郵件,密碼,姓氏,名字

任何幫助將不勝感激。這個網站很棒!

+3

你有一些可怕的SQL注入漏洞。 –

回答

0

編輯:史蒂夫得到它的權利,我錯過了單引號,但很確定你需要搜索你的電子郵件字段,而不是名字字段。

您的電子郵件地址存儲在名字字段?

將其更改爲您的電子郵件領域

private void login_Click(object sender, EventArgs e) 
{ 
    string email = lemail.Text; 
    Dictionary<string, string> dik = sqlClient.Select("UserList", "YOUR_EMAIL_FIELD = " + email); 
    var lines = dik.Select(kv => kv.Key + ": " + kv.Value.ToString()); 
    logged.AppendText(string.Join(Environment.NewLine, lines)); 
} 

另外,請看SQL注入和使用參數化查詢。

+0

我正在修改代碼並意外複製了錯誤的版本。我確實在看電子郵件字段。我的INSERT方法確實有參數化查詢。當我從數據庫中拉出時,我不認爲你會去做SQL注入。你懂得越多。謝謝! – user2908467

+0

@ user2908467用戶輸入的自由格式文本可以終止您的SELECT並執行任何其他查詢。它確實是一個令人討厭和容易的漏洞。 – TyCobb

0

我想這個問題是由於缺少一個字符串值的單引號造成的。
我可以建議簡單地添加引號電子郵件值這樣

Dictionary<string, string> dik = sqlClient.Select("UserList", 
                "firstname = '" + email + "'"); 

,但是這的確是一個糟糕的補救措施,以您的問題。

真正的變化應該是傳遞一個參數列表來執行查詢並避免所有這些混亂的字符串引號和sql注入漏洞。

然而,這需要在你的選擇方法和方式的改變,你叫它

public Dictionary<string, string> Select(string table, string WHERE, MySqlParameter[] prms) 
{ 

    string query = "SELECT * FROM " + table + " WHERE " + WHERE + ""; 

    Dictionary<string, string> selectResult = new Dictionary<string, string>(); 

    if (this.Open()) 
    { 
     MySqlCommand cmd = new MySqlCommand(query, conn); 
     cmd.Parameters.AddRange(prms); 
     MySqlDataReader dataReader = cmd.ExecuteReader(); 
     try 
     { 
      ...... 
     } 
     catch { } 
     this.Close(); 
     return selectResult; 
    } 
    else 
    { 
     return selectResult; 
    } 
} 

和呼叫應

List<MySqlParameter> prms = new List<MySqlParameter>() 
MySqlParameter p = new MySqlParameter("@mail", SqlDbType.VarChar).Value = lemail.Text; 
prms.Add(p); 
Dictionary<string, string> dik = sqlClient.Select("UserList", "firstname = @mail", prms.ToArray()); 

有在你的代碼是其他關鍵點雖然不相關到您目前的例外。

1)如果這sqlClient.Count計算你的表的記錄,然後行

for (int i = 0; i <= sqlClient.Count("UserList"); i++) 

循環的一個元素超過所需。只需要i < sqlClient.Count

2)在Select方法中,你吞併了異常,這是非常糟糕的,因爲在這個關鍵方法中的每一次失敗永遠都不會被知道。

相關問題