2015-04-27 3 views
0

Я пытался заставить эту часть кода работать некоторое время, но похоже, что это не так. Мой пользователь вводит имя пользователя и пароль, а затем программа сравнивает его с БД. Однако он отображает Недействительные учетные данные, даже если при выводе пароля он отображает то же самое, что и я. В нескольких точках я знаю, что некоторые из вас будут указывать на такие вещи, как использование отдельного класса для подключения, проверка против имени пользователя для вместо использования Select *, используйте хешинг и все. Но сейчас я просто хочу, чтобы этот код работал. Только после этого я смогу работать над другими аспектами, чтобы обеспечить его эффективность. Спасибо всем заранее :)Проверка учетных данных в отношении Db с использованием JDBC

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()); 
     } 


} 
+0

Тип пароля в моей базе данных является VARCHAR. –

+1

Вы пробовали в debugmode? Я думаю, что вы только проверяете первый пароль из db, и если это не соответствует вы показываете errormessage – 0riginal

+0

Попробуйте отладить код до того момента, когда вы назначаете значение 'password = rs.getString (« Пароль »);' и сравните значение отладки с вашим значением 'Password1'. Это поможет вам определить, вернётся ли правильное значение. –

ответ

3

Те две строки:.

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

Они строковых литералов, так что если ваш пароль не буквально jPassword1Field2.geText(), там не собирается быть совпадение. Я думаю, что вы имели в виду:

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

Однако обратите внимание, что JPasswordField.getText() является устаревшим, так как Java 2. Вы должны использовать getPassword() вместо:

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

документация оправдывает устаревание по getText() с «по соображениям безопасности», что я не могу претендовать, чтобы понять, но вы все равно не должны использовать устаревшие части API.


И я знаю, что вы некоторые из ниже уже и никто из этого не является частью вашего вопроса, но я действительно полагаю, что вы

  1. Проверка по имени пользователя. Это должно быть очевидно, почему.
  2. Хеш-пароли. Всегда.
  3. Используйте только то, что вам нужно, в основном по соображениям производительности. Обычно наилучшим способом является использование предложения WHERE в SQL (что приносит вам необходимость дезинфицировать ваш вход, но вы все равно должны это делать) и построение списка столбцов вместо выборки *.
  4. Используйте обратные ссылки для имен базы данных/таблиц/столбцов в SQL, чтобы избежать таких вещей, как случайное использование ключевого слова в качестве имени таблицы или столбца.

Применяя выше, я предлагаю следующий запрос (при условии, имя поля называется Username):

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

«соображения безопасности» для использования 'getPassword()' намекаются на комментарий javadoc: _Для большей безопасности рекомендуется, чтобы возвращаемый массив символов был очищен после использования, установив каждый символ равным нулю. Лучшая практика очистки пароль (или другая конфиденциальная информация) после использования - это то, что вы не можете сделать с неизменяемыми строками Java, возвращаемыми 'getText()'.Более подробные объяснения можно найти в разделе [этот вопрос о стекеповерхности] (https://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords). – fspinnenhirn

+0

Я прочитал заметку JavaDoc, и получаю, что с массивом у вас есть фактическая ссылка на данные и я могу ее очистить, но я не могу придумать случай, когда вредоносный код мог бы получить ссылку на массив символов без возможность использовать его во времени или где он не мог получить ссылку на поле пароля. Но если речь идет только о минимизации возможного окна атаки, то это именно так. – Siguza

+0

Это точно о том, что: минимизация риска необоснованного разоблачения конфиденциальной информации; идея заключается в том, что память может быть заменена на диск или записана в дампе ядра, или переменная может быть случайно передана в регистратор. – fspinnenhirn

Смежные вопросы