2014-03-29 32 views
0

創建一個網站登錄系統,但是當我運行它時,它不斷提出這個錯誤到下面編碼的特定位。是否有人可以幫助我在這個特殊的代碼此錯誤消息:附近關鍵字 「使用者」語法錯誤:數據庫登錄系統的語法錯誤

System.Data.SqlClient.SqlException。

代碼:

public static User LoginUser(string login, string password) 
    { 
     //Check if user exists 
     string query = string.Format("SELECT COUNT(*) FROM TeesDB.dbo.user WHERE name = '{0}'", 
     login); 
     command.CommandText = query; 

     try 
     { 
      conn.Open(); 
      int amountOfUsers = (int) command.ExecuteScalar(); 

      if(amountOfUsers == 1) 
      { 
       //User exists, check if the password match 
       query = string.Format("SELECT password FROM users WHERE name = '{0}", login); 
       command.CommandText = query; 
       string dbPassword = command.ExecuteScalar().ToString(); 


       if (dbPassword == password) 
       { 
        //password match. Login and password data are known to us. 
        //retrieve further user data from the database 
        query = string.Format("SELECT email, user_type FROM users WHERE name = 
         '{0}'", login); 
        command.CommandText = query; 

        SqlDataReader reader = command.ExecuteReader(); 
        User user = null; 

        while (reader.Read()) 
        { 
         string email = reader.GetString(0); 
         string type = reader.GetString(1); 

         user = new User(login, password, email, type); 
        } 
        return user; 
       } 
       else 
       { 

        //passwords do not match 
        return null; 

       } 

      } 
      else 
      { 

       //user exists 
       return null; 

      } 
     } 
     finally 
     { 

      conn.Close(); 
     } 
     } 
     } 
    } 
+1

你的表很可能命名爲「用戶」而不是「用戶」做到這一點。另外,你應該參數化你的SQL命令,因爲你有很大的SQL注入風險。 [給我參數化SQL或給我死亡](http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/)。另外,請看看像BCrypt鹽和散列你的密碼;不要以明文形式存儲它們! –

+0

好的歡呼,所以你認爲如果我改變用戶的用戶,它應該工作,感謝您的反饋,我很欣賞它。即時通訊也非常新,所以即時通訊不知道你是什麼意思通過散列我的密碼 –

+0

非常感謝你,我的部分輕微拼寫錯誤!感謝您的注意! –

回答

1

這是因爲用戶是保留關鍵字。要提到它在你的查詢您需要封裝方括號

string query = string.Format("SELECT COUNT(*) FROM [user] WHERE name = ..... 

,但在這一點上,爲什麼在後續查詢使用名稱users之間的字?這只是第一個查詢中或下一個查詢中的拼寫錯誤?

但是,您還應該記住,以這種方式格式化查詢的字符串非常糟糕。
您是在SQL注入的風險,如果一個單引號出現在文本值,則整個查詢將在一個無效的語法

作爲一個參數化查詢的例子resul替換查詢

string query = "SELECT COUNT(*) FROM [user] WHERE name = @name", 
command.CommandText = query; 
command.Parameters.AddWithValue("@name",login); 
int amountOfUsers = (Convert.ToInt32(command.ExecuteScalar()); 
if(amountOfUsers > 0) 
{ 
    ..... 
} 

然後下一個問題是從數據庫中檢索密碼並與用戶輸入進行比較。擁有這種代碼意味着密碼在數據庫中以明文形式存儲。明確的安全風險。您應該以加密形式存儲密碼。當您需要檢查用戶憑證時,您將相同的加密算法應用於用戶輸入並檢查數據庫中的密碼。

你可以在一個單一的操作

string cryptPwd = EncryptPassword(password); 
string query = "SELECT COUNT(*) FROM [user] WHERE name = @name and password = @cryptpwd", 
.... 
+0

得到它的工作非常感謝您的意見,實際上不是錯誤,上面的人得到它的位置! –