c#
  • mysql
  • oledb
  • 2015-10-13 67 views 0 likes 
    0

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

    你的意思是_doesn't work_?你得到任何異常或錯誤信息?你如何準確地執行你的查詢?順便說一下,不要將密碼存儲爲純文本。閱讀:http://stackoverflow.com/questions/1054022/best-way-to-store-password-in-database –

    +0

    沒有上下文 - 你在你的數據庫中存儲密碼? – Marco

    +0

    @SonerGönül爲了清楚起見,我已通過答覆更新。 – CBreeze

    回答

    1

    根據MSDNOleDbCommand不支持命名參數。嘗試使用?來代替。

    當CommandType設置爲Text時,OLE DB .NET Provider不支持將參數傳遞給SQL語句或由OleDbCommand調用的存儲過程的命名參數。在這種情況下,必須使用問號(?)佔位符。例如:

    SELECT * FROM Customers WHERE CustomerID = ?

    因此,在這種OleDbParameter對象添加到OleDbParameterCollection的順序必須直接對應於問號佔位符在命令文本的參數的位置。

    +0

    )Microsoft有修改鏈接的習慣,您可能需要從歷史文檔中複製/粘貼相關代碼片段 – gigaplex

    +0

    沒有我的朋友,MSDN的錯誤在於此提供程序**支持**支持命名參數。它只是不關心參數名稱,只關心他們的命令,這意味着你**不必爲這個提供者的每一個參數**使用'?' –

    +0

    @SonerGönül更改爲'?'而不是'@用戶名'確實在這種情況下工作 – CBreeze

    相關問題