使用 JDBC 检查 Db 的凭据

Checking Credentials against Db using JDBC

我一直在尝试让这段代码工作一段时间,但似乎行不通。我的用户输入用户名和密码,然后程序将其与数据库进行比较。然而它显示无效凭据,即使当我输出密码时它显示完全相同我有 input.Just 几点,我知道你们中的一些人会指出诸如使用单独的 class 之类的事情连接,检查用户名的密码而不是使用 Select *,使用散列和所有。但是现在我只需要让这段代码工作。只有在那之后,我才能在其他方面工作以提高其效率。提前谢谢大家。:)

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
    // TODO add your handling code here:
    Username1 = "jTextField1.getText()";
    Password1 = "jPassword1Field2.geText()";
      try 
        {
        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
        String url = "jdbc:mysql://localhost:3306/"; 
        String dbName = "VideoSystem" ;
        String userName = "root"; 
        String passWord = "**mypassword**";
        Connection conn = DriverManager.getConnection(url+dbName, userName, passWord); 
        Statement st = conn.createStatement();
        String sql = ("SELECT * FROM Identification");
        ResultSet rs = st.executeQuery(sql);
        while(rs.next()) 
            { 
            password = rs.getString("Password");
            if( Password1.equals(password)) 
            {
                      MenuSelection obj1 = new MenuSelection();
                      obj1.setVisible(true);
            }
            else
            {
             JOptionPane.showMessageDialog(null, "Invalid Credentials", "System Message", JOptionPane.INFORMATION_MESSAGE);

            }
            }
        conn.close();
        }
      catch (Exception e) 
        { 
      System.err.println("Got an exception! "); 
      System.err.println(e.getMessage()); 
        } 


}

那两行:

Username1 = "jTextField1.getText()";
Password1 = "jPassword1Field2.geText()";

它们是字符串文字,因此除非您的密码字面上是 jPassword1Field2.geText(),否则不会匹配。我想你的意思是:

Username1 = jTextField1.getText();
Password1 = jPassword1Field2.getText();

但是请注意,JPasswordField.getText() is deprecated since Java 2. You should use getPassword() 而不是:

Password1 = new String(jPassword1Field2.getPassword());

文档证明了 getText() 和 "security reasons" 的弃用是合理的,我无法声称理解,但您仍然不应该使用 API 的弃用部分。


我已经知道你下面的一些内容,none 是你问题的一部分,但我真的建议你

  1. 检查用户名。原因应该很明显。
  2. 哈希密码。总是。
  3. 只获取您需要的内容,主要是出于性能原因。通常最好的方法是在 SQL 中使用 WHERE 子句(这需要清理您的输入,但无论如何您都应该这样做)并构建列列表而不是获取 *.
  4. 在 SQL 中对 database/table/column 名称使用反引号以避免意外使用关键字作为 table/column 名称等情况。

应用以上内容,我建议进行以下查询(假设名称字段被称为 Username):

PreparedStatement st = conn.prepareStatement("SELECT `Password` FROM `Identification` WHERE `Username` = ?");
st.setString(1, Username1);
ResultSet rs = st.executeQuery();