Я пытаюсь сделать простой журнал в sistem с java и mysql, конфигурация db составлена, но у меня есть ошибка в SQL sintax:
System.out.println("SISTEM LOGIN");
System.out.println("INSERIRE NOMEUTENTE");
Scanner scan= new Scanner(System.in);
String user= scan.nextLine();
System.out.println("INSERIRE PASSWORD");
String pass= scan.nextLine();
try {
boolean log = true;
while(log) {
//conn db
Connection c = DriverManager.getConnection(url,usr,pswd);
//creaz statement
Statement ss = c.createStatement();
//creaz codice sql
String sql = " SELECT * FROM users WHERE user'" + user + "' && password='" + pass+ "' ";
ResultSet res = ss.executeQuery(sql);
if(res!=null) {
System.out.println("LOGIN");
log = false;
}
else System.out.println("LOGIN FAILE");
}
}
как вы думаете, что я не вижу в строке sql? это ответ:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''ciao' && password='12'' at line 1
Ваш запрос неверен
String sql = " SELECT * FROM users WHERE user'" + user + "' && password='" + pass+ "' ";
Если вы проверите, вы включили "' && password='" + pass+ "' ";
но в forst часть оператора user'" + user
здесь отсутствует =
Правильный запрос должен быть
String sql = " SELECT * FROM users WHERE user='" + user + "' && password='" + pass+ "' ";
Следующее утверждение неверно и его следует избегать:
String sql = " SELECT * FROM users WHERE user'" + user + "' && password='" + pass+ "' ";
Конкатенация строк делает ее уязвимой для атак SQL-инъекций. Используйте preparedstatement
. Посмотрите здесь пример и здесь.
Кроме того, вам не хватает =
после user
и замените &&
на AND
.
И, как было предложено по error
, один раз выполните руководство по mysql.
Ваш расширенный оператор SQL читает
SELECT * FROM users WHERE user 'ciao' && password='12'
Это неправильно. Чтобы быть действительным SQL, нужно сказать
SELECT * FROM users WHERE user = 'ciao' AND password='12'
@PritamBanerjee отметил, что он уязвим для SQL-инъекции. Это опасно.
И это ужасно по другой причине. Вы никогда не должны, никогда не храните пароли расшифровывали в СУБД. Если вы не знаете, почему, посетите https://haveibeenpwned.com.
В руководстве по php есть хорошее объяснение правильного способа сделать это. http://php.net/manual/en/faq.passwords.php Для этой цели вы должны использовать одностороннюю функцию скремблирования, такую как bcrypt.
Вот некоторые приличные материалы о том, как это сделать на Java. https://www.owasp.org/index.php/Hashing_Java
На самом деле нет никаких проблем с оператором &&, как указано в комментариях: https://dev.mysql.com/doc/refman/5.7/en/non-typed-operators.html
Вы просто пропустили оператор = сразу после инструкции WHERE user
.
Я предлагаю вам использовать "подготовленные заявления" при вводе параметров в ваш SQL-запрос для предотвращения внедрения SQL-запросов (как предотвращает или предотвращает SQL-инъекцию PreparedStatement?).
PreparedStatement stmt = c.prepareStatement("SELECT * FROM users WHERE user=? && password=?");
stmt.setString(1, user);
stmt.setString(2, pass);
ResultSet res = stmt.executeQuery();
WHERE user
?