2013-06-25 7 views
-2

У меня возникли проблемы с запуском моей программы. Я смог очистить любые синтаксические ошибки, но теперь я выдал свой вывод. У меня есть следующее утверждение, и ELSE IF, похоже, не работает? он всегда игнорирует else, если коды. Я не могу понять проблему с кодом.

Может кто-нибудь мне помочь?Оператор if работает, но если нет. Зачем?

private void login_btnActionPerformed(java.awt.event.ActionEvent evt) { 

    Connection con; 
    PreparedStatement stmt; 
    ResultSet rs; 

    try {  

     //connect to the database 
     String host = "jdbc:derby://localhost:1537/LoginSystem"; 
     String uName = "root"; 
     String uPass = "root"; 
     con = DriverManager.getConnection(host, uName, uPass); 

     String user = username_txt.getText(); 
     String pass = passwordField_txt.getText(); 

     String sql = "Select USERNAME,PASSWORD from LOGINSYSTEM where USERNAME = '"+user+"' AND PASSWORD = '"+pass+"'"; 
     stmt = con.prepareStatement(sql);   

     rs = stmt.executeQuery(); 

     while(rs.next()) { 

      String s1 = rs.getString(1); 
      String s2 = rs.getString(2); 

      if(user.equals(s1) && pass.equals(s2)) { 

       JOptionPane.showMessageDialog(null, "Login Successfull!"); 
       Account obj = new Account(); 
       obj.setVisible(true); 

      } else if(!user.equals(s1) && !pass.equals(s2)) { 

       JOptionPane.showMessageDialog(null, "Login Failed!"); 

      } else if(!pass.equals(s2)) { 
       JOptionPane.showMessageDialog(null, "Please Enter A Valid Password."); 
       passwordField_txt.setText(null); 
      } 
     } 

    } catch(SQLException e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
}           
+3

Какой выход вы получаете? –

+1

ваш запрос sql всегда будет возвращать ТОЛЬКО строки с действительным логином и паролем, поэтому его невозможно ввести иначе, если оператор – gawi

+4

, что, если мое имя пользователя ''); DROP TABLE LOGINSYSTEM; - '? –

ответ

3

запрос возвращает соответствующие user и pass значения, поэтому нет никаких условий, где !user.equals(s1) && !pass.equals(s2) является. Удовлетворяется Всегда используйте PreparedStatement заполнители, а не String конкатенации для защиты от SQL-инъекций.

Дифференциация ошибки между недопустимыми именами пользователей и паролями позволяет любому потенциальному хакеру понять, какую информацию можно использовать для получения доступа к системе.

Если что код должен выглядеть

if (rs.next()) { 

    String s1 = rs.getString(1); 
    String s2 = rs.getString(2); 

    // user and pass already match from SQL - no if logic necessary 

} else { 
    // display GENERIC login failure message 
} 

Но хранить пароли в базе данных является главный недостаток безопасности так весь этот подход не безопасно. Типичным подходом является сохранение пароля с использованием salt для защиты от использования rainbow tables. Чтобы проверить пароль, для сравнения с тем, что хранится в базе данных, можно использовать тот же алгоритм хэширования и соли,

+0

Я хочу, чтобы другие инструкции выполнялись, когда имя пользователя и пароль не совпадают. что делать тогда? – Beginner

+0

Из запроса выясняется, что вы получаете только значения, которые соответствуют. Отлаживайте свой код самостоятельно, чтобы убедиться, что это так. В этом случае блок 'else if' никогда не вводится – Reimeus

+0

, можете ли вы предоставить код для того, что я хочу сделать? Я застрял! – Beginner

0

Сначала это подвержено атаке SQL-инъекций. Узнайте о подготовленных заявлений и использовать параметр проходящее функцию подготовленных заявлений, чтобы предотвратить имена пользователей, как: Little Bobby Tables

Во-вторых, ваш, где оператор будет только вернуться строки, где имя пользователя и пароль точные совпадения с введенным значения. Поэтому сравнение результата, отличного от нуля, будет гарантировано, чтобы всегда соответствовать, за исключением некоторой невероятно странной ошибки базы данных.

Если вы попросите меня дать вам плод, где фрукты - красное яблоко, то, полагая, что мне доверяют, когда я даю вам красное яблоко, проверяя, не яблоко ли яблоко или что красный не является красным, приведет к проверке состояния, которое никогда не выполняется.

+0

спасибо! но можете ли вы указать правильный код для того, что я хочу сделать? – Beginner

+0

Я рад помочь вам научиться бесплатно; но если вы хотите, чтобы я предоставил вам решение, у меня были разумные ставки по контрактам. читайте http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html http://javarevisited.blogspot.com/2012/05/best-practices-while-dealing-with.html http://www.jasypt.org/howtoencryptuserpasswords.html –

0

Если имена пользователей принудительно уникальны, вы можете принять это условие соответствия для пароля из запроса. Затем просто запросите условие соответствия имени пользователя и получите имя пользователя и пароль для этой строки. Таким образом, вы можете более легко проверить неправильный пароль или неправильное имя пользователя. То, как теперь, запрос будет возвращать результаты только в том случае, если имя пользователя и пароль верны, и вы никогда не войдете в другое.