Войти с помощью SQL и Java

0

Я пытаюсь сделать простой журнал в 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
  • 1
    Отсутствует = после WHERE user ?
Теги:
jdbc
login

4 ответа

0
Лучший ответ

Ваш запрос неверен

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+ "' ";
3

Следующее утверждение неверно и его следует избегать:

   String sql = " SELECT * FROM users WHERE user'" + user + "' && password='" + pass+ "' "; 

Конкатенация строк делает ее уязвимой для атак SQL-инъекций. Используйте preparedstatement. Посмотрите здесь пример и здесь.

Кроме того, вам не хватает = после user и замените && на AND.

И, как было предложено по error, один раз выполните руководство по mysql.

  • 0
    Более того, в созданном запросе есть синтаксическая ошибка.
  • 0
    @hamidghasemi Да, добавил это тоже.
Показать ещё 2 комментария
2

Ваш расширенный оператор 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

  • 1
    Плач: спустя почти десятилетие после взлома пароля Adobe, люди все еще изобретают свои собственные схемы проверки пароля. Почему? Почему? Разве университеты не учат, что это опасно? Интернет кишит киберпреступниками, которые крадут пользовательские данные и продают их.
  • 1
    Интернет также полон учебников по программированию, которые небезопасны. Кроме того, не все программисты из университета
0

На самом деле нет никаких проблем с оператором &&, как указано в комментариях: 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();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню