2013-03-01 61 views
4

我已經成功將我的Java應用程序連接到MySQL,然後我希望用戶輸入他們的用戶名和密碼。然後它會向MySQL發送一個查詢,然後用該用戶名查找一個地點,然後將給定的密碼與數據庫中的密碼進行比較。 大多數情況下,這是有效的。假設用戶名是「ABC」,密碼是「def」。如果提示輸入用戶名,並輸入「ABC def」,則說明它成功,與密碼「def a」相同。我相信問題是rs.next(),它只檢查空間前的任何文本。Java&MySQL - 創建登錄驗證

解決方案的任何想法?

String databaseUsername = ""; 
    String databasePassword = ""; 

    // Check Username and Password 
    System.out.print("Enter Username: "); 
    String name = sc.next(); 
    System.out.print("Enter Password: "); 
    String password = sc.next(); 

      // Create SQL Query 
    Statement stmt = connection.createStatement(); 
    String SQL = "SELECT * FROM users WHERE users_name='" + name + "' && users_password='" + password+ "'"; 

    ResultSet rs = stmt.executeQuery(SQL); 

      // Check Username and Password 
    while (rs.next()) { 
     databaseUsername = rs.getString("users_name"); 
     databasePassword = rs.getString("users_password"); 
    } 

    if (name.equals(databaseUsername) && password.equals(databasePassword)) { 
     System.out.println("Successful Login!\n----"); 
    } else { 
     System.out.println("Incorrect Password\n----"); 
    } 
+3

使用'PreparedStatement'來避免SQL注入。另外,什麼是不工作? – 2013-03-01 19:08:21

+2

1)不要存儲明文密碼,將它們散列。 2)如果你得到任何記錄,那麼用戶名和密碼匹配,所以不需要進一步檢查(你不需要從數據庫中獲取值並在java中匹配它)。 – SJuan76 2013-03-01 19:09:08

+0

更大的問題是,如果您在提示輸入用戶名時在一行中鍵入用戶名和密碼 - >「ABC def」,則表示登錄成功。我希望它是兩個步驟。所以「ABC def」不會是一個正確的用戶名,「ABC」是。 – 2013-03-01 19:11:49

回答

3

如果ResultSet返回一行,用戶名和密碼已經被SQL聲明檢查。你不需要再次檢查。另外,您應該放置一個系統,其中相同的用戶名不能多次使用。 (使其在數據庫中爲Unique或鍵)

另外,使用準備好的語句和哈希密碼來避免注入和其他攻擊。

+0

我仍然在學習MySQL/Java,您可以建議一個網站了解哈希密碼的信息嗎?謝謝! 而不是雙重檢查是合理的,謝謝! – 2013-03-01 19:13:08

+0

使用md5散列檢出http://stackoverflow.com/questions/415953/generate-md5-hash-in-java。如果您有更多問題,請給我留言。 – 2013-03-01 19:14:26