2014-01-31 4 views
-2
String sSQL = "select RFC,Contraseña from Administradores where RFC='" + txtUsuario.getText() + "' and Contraseña='" + txtContrasena.getText() + "'"; 

String[] registros = new String[2]; 
Try { 
    conect(); 
    conexion = DriverManager.getConnection("jdbc:sqlite:" + base); 
    Statement stat = conexion.createStatement(); 
    ResultSet rs = stat.executeQuery(sSQL); 
    while (rs.next()) { 
     registros[0] = rs.getString("RFC"); 
     registros[1] = rs.getString("Contraseña"); 
    } 
    stat.close(); 
    conexion.close(); 
} catch (SQLException ex)  
{  
    JOptionPane.showMessageDialog(null,"DB connection error");  
} 
if ((txtContrasena.getText().equals(registros[1])) || (txtUsuario.getText().equals(registros[0]))) { 
    JOptionPane.showMessageDialog(null, "Access Granted"); 
    Escoger variable = new Escoger(); 
    variable.setVisible(true); 
    dispose(); 
} else { 
    if (txtContrasena.getText() != (registros[1])) { 
     JOptionPane.showMessageDialog(null, "Incorrect password"); 
    } 
} 
+1

Почему вы думаете, что это не так? – SLaks

+2

Если вы не используете подготовленные заявления, то да. – chrylis

ответ

3

Это ...

String sSQL = "select RFC,Contraseña from Administradores where RFC='" + 
       txtUsuario.getText() + "' and Contraseña='" + 
       txtContrasena.getText() + "'"; 

автоматически предложит ли это. Все, что вводится в txtUsuario и txtContrasena, может содержать действительный код SQL, который может быть выполнен механизмом SQL базы данных.

Вы должны использовать:

String sSQL = "select RFC,Contraseña from Administradores where RFC=? and Contraseña=?"; 

Затем вам нужно будет изменить ...

Statement stat = conexion.createStatement(); 

Для

PreparedStatement stat = conexion.preapreStatement(sSQL); 
stat.bindString(1, txtUsuario.getText()); 
stat.bindString(2, txtContrasena.getText()); 

Посмотрите на Using Prepared Statements для получения более подробной информации

3

Кроме того, вы никогда не должны хранить пароль в базе данных. Вы должны сохранить хешированную версию пароля в базе данных и проверить пароль, который у вас есть, что вам дано (безопасно, https, если через интернет), и сравнить это хеш-значение с хэш-значением в базе данных. Используйте безопасный алгоритм хеширования (например, MD5). Еще лучше соединить имя пользователя и пароль и хэш, а затем использовать это как значение для хранения в базе данных и сравнить (таким образом, два пользователя с одним и тем же паролем не имеют хэша с одинаковым значением).

+0

+1 Это действительно потрясающий совет! – MadProgrammer

0

Да. Вместо этого используйте PreparedStatements. Замените значения пользователя и пароля на заполнители.

String SampleQuery = "SELECT * FROM YourTable WHERE User = ? AND Password = ?"; 
String UserName = UsernameBox.getText(); 
String Password = PasswordBox.getText(); 

PreparedStatement prep = conn.prepareStatement(SampleQuery); 
prep.setString(1, UserName); 
prep.setString(2, Password); 
ResultSet result = prep.executeQuery(); 
Смежные вопросы