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

3 に答える 3

0

まず、これは SQL インジェクション攻撃の対象となります。プリペアド ステートメントについて学び、プリペアド ステートメントのパラメーター受け渡し機能を使用して、次のようなユーザー名を防止します。

第 2 に、where ステートメントは、ユーザー名とパスワードが入力値と完全に一致する行のみを返します。したがって、null 以外の結果を比較すると、信じられないほど奇妙なデータベースのバグを除いて、常に一致 することが保証されます。

果物が赤いリンゴである場合、果物を与えるように頼まれた場合、私が信頼されていると仮定すると、赤いリンゴを与えるときに、リンゴがリンゴではないかどうか、または赤が赤くないかどうかを確認します。満たされない条件をチェックすることになります。

于 2013-06-25T16:21:41.063 に答える
0

ユーザー名を一意にする必要がある場合は、パスワードの一致条件をクエリから除外できます。次に、ユーザー名の一致条件を照会して、その行のユーザー名とパスワードを取得します。このようにして、間違ったパスワードまたは間違ったユーザー名をより簡単に確認できます。現在の方法では、クエリはユーザー名とパスワードが正しい場合にのみ結果を返し、else if を入力することはありません。

于 2013-06-25T16:21:44.020 に答える