2012-04-14 11 views
0

Ich versuche, eine Login-Benutzeroberfläche mit Java zu erstellen. Aber es gibt ein Problem mit meiner SQL-AuthentifizierungAnmeldung mit SQL-Authentifizierung in Java

Hier ist der Code:

public void actionPerformed(ActionEvent e){ 
      if (e.getSource() == Login) 

        try { 
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
       Connection con=DriverManager.getConnection("jdbc:odbc:MessageStore","sa","12345"); 
       Statement cmd=con.createStatement(); 
       ResultSet rs=cmd.executeQuery("select * from UserList where UserName='"+nameText.getText()); 
    } 

Aber es gibt eine Warnung mit „rs“: Der Wert der lokalen Variablen rs nicht verwendet wird

Wie um dieses Problem zu lösen?

Oder gibt es einfacheren Code zum Implementieren der SQL-Authentifizierung?

Danke

+1

Die Datenbankwerte können von ResultSet erhalten müssen Sie durchlaufen. –

+1

Das ist offen für die SQL-Injektion. Sie müssen die Zeichenfolge ausschließen oder eine vorbereitete Anweisung verwenden. Außerdem erfolgt die Warnung, weil Sie keine rs verwenden. Wenn Sie keine rs verwenden, ordnen Sie die Rückgabe nicht rs zu. Sie müssen es jedoch verwenden, weil Sie es verwenden müssen, um entweder zu überprüfen, ob eine Zeile existiert, oder wahrscheinlicher zu prüfen, ob ein Passwort korrekt ist. Sie sollten auch vorsichtig sein, wenn Sie Personen direkt mit Ihrem SQL-Server verbinden möchten. Das kann eine Sicherheitslücke sein, wenn jemand, den Sie nicht erwarten, eine Verbindung zu ihm außerhalb Ihrer Anwendung herstellt. – Corbin

Antwort

1

In den meisten Fällen von „Der Wert der Variablen X wird nicht verwendet“ Sie können wählen, die Nachricht oder entfernen Sie die Zuordnung, um es zu ignorieren. In diesen Fällen machst du nichts mit dem Wert.

In diesem Fall führen Sie jedoch nur eine Abfrage in der Datenbank durch, aber tun Sie nie etwas mit dem Ergebnis. Sie wissen also nicht, ob der Benutzer, den Sie zu validieren versuchen, tatsächlich ein gültiger Benutzer ist.

Sie müssen also die Variable "rs" verwenden, um zu prüfen, ob tatsächlich ein Ergebnis vorliegt und der Benutzer sich anmelden darf.

public void actionPerformed(ActionEvent e){ 
    if (e.getSource() == Login){ 
    try { 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // may not be needed since JDBC4 
     Connection con=DriverManager.getConnection("jdbc:odbc:MessageStore","sa","12345"); 
     PrePareStatement cmd=con.prepareStatement("select * from UserList where username=?"); // safer, protect against 
     cmd.setString(1,nameText.getText()); 
     ResultSet rs=cmd.executeQuery(); 
     if(rs.next()){ 
     // username does exist, now check the password 
     }else{ 
     // username does not exist 
     } 
    }catch(Exception e){} 
    } 
} 
+0

Sie haben schleichend eine [vorbereitete Anweisung] (http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html) eingefügt, was ein großes Plus ist, da die String-Verkettung in OPs Post eine schlechte Übung ist. Es ist aufgrund der SQL-Injection nicht sicher. – hamena314

0

Machen Sie ResultSet als globale Variable.

public void actionPerformed(ActionEvent ae) { 
if (ae.getSource() != null) { 
String connectionUrl = "jdbc:sqlserver://localhost:1420;" + "databaseName=TestsampleDB1;"; 
Connection con = null; 
Statement stmt = null; 
ResultSet rs = null; 
try { 
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    System.out.println("Driver okay"); 
    con = (Connection) DriverManager.getConnection("jdbc:odbc:MessageStore", "sa", "12345"); 
    System.out.println("Connection Made"); 
    PreparedStatement cmd = con.prepareStatement("select * from UserList where username=?"); 

    if (rs.next()) { 
     // login user exist 
    } else { 
    // user doesn't exist} 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
    } 

} }