yusof26 Ответов: 1

Проверка входа в систему на java с помощью mysql


Я столкнулся с проблемой при проверке логина java с MySQL может кто нибудь пожалуйста посмотреть на код и попытаться помочь я продолжаю получать неправильное имя пользователя и пароль

Что я уже пробовал:

package sample;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.stage.Stage;


import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DataBaseProject1 extends Application {

    Connection conn;
    PreparedStatement pst = null;
    ResultSet rs = null;

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        //GUIS a = new GUIS();
        //a.createConnection();
        //a.display();
        DataBaseProject1 d = new DataBaseProject1();
        d.createConnection();

        primaryStage.setTitle("Retrive Database Values Into CheckBox");

        //primaryStage.getIcons().add(new Image("file:user-icon.png"));
        BorderPane layout = new BorderPane();
        Scene newscene = new Scene(layout, 1200, 700, Color.rgb(0, 0, 0, 0));

        Group root = new Group();
        Scene scene = new Scene(root, 320, 200, Color.rgb(0, 0, 0, 0));
        scene.getStylesheets().add(getClass().getResource("Style.css").toExternalForm());

        Color foreground = Color.rgb(255, 255, 255, 0.9);

        //Rectangila Background
        Rectangle background = new Rectangle(320, 250);
        background.setX(0);
        background.setY(0);
        background.setArcHeight(15);
        background.setArcWidth(15);
        background.setFill(Color.rgb(0 ,0 , 0, 0.55));
        background.setStroke(foreground);
        background.setStrokeWidth(1.5);

        VBox vbox = new VBox(5);
        vbox.setPadding(new Insets(10,0,0,10));

        Label label = new Label("Label");
        //label.setTextFill(Color.WHITESMOKE);
        label.setFont(new Font("SanSerif", 20));

        TextField username = new TextField();
        username.setFont(Font.font("SanSerif", 20));
        username.setPromptText("Username");
        username.getStyleClass().add("field-background");

        PasswordField password =new PasswordField();
        password.setFont(Font.font("SanSerif", 20));
        password.setPromptText("Password");
        password.getStyleClass().add("field-background");

        Button btn = new Button("Login");
        btn.setFont(Font.font("SanSerif", 15));
        btn.setOnAction(e ->{
            try{
                String user = username.getText();
                String pass = password.getText();
                String query = "SELECT * FROM userdatabase.userdatabasetable Where username = '"+user+"' AND password = '"+pass+"' ";
                pst = conn.prepareStatement(query);
                pst.setString(1,user);
                pst.setString(2,pass);
                rs = pst.executeQuery();

                if(rs.next()){
                    label.setText("Login Successful");
                    primaryStage.setScene(newscene);
                    primaryStage.show();
                }else{
                    label.setText("Login Failed");
                }
                username.clear();
                password.clear();
                pst.close();
                rs.close();
            }catch(Exception e1){
                label.setText("SQL Error");
                System.out.println("Wrong UserName Or Password");
                //System.err.println(e1);
            }
        });

        vbox.getChildren().addAll(label, username, password, btn);
        root.getChildren().addAll(background, vbox);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }

    Connection createConnection ()
    {
        try
        {
            //Class.forName("com.mysql.jdbc.Driver");
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","yusof","1234");
            System.out.println("DataBase Connected Successfully");
            con.close();
        }
        catch (ClassNotFoundException | SQLException ex)
        {
            Logger.getLogger(DataBaseProject1.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
}

Richard MacCutchan

Просто сбрасывать свой код (неформатированный, который я исправил) и ожидать, что люди а) поймут, что не так, и Б) исправят его, считается грубым. Пожалуйста, объясните, что именно происходит, когда вы запускаете код. При необходимости используйте отладчик, чтобы узнать, какие значения проверяются. Кстати, у вас есть две основные проблемы, которые нужно срочно решить:
1. вы храните пароли в открытом тексте.
2. вы используете конкатенацию строк для создания ваших SQL-команд, что может привести к разрушению вашей базы данных. Всегда используйте параметризованные запросы.

Richard Deeming

В дополнение к этому SQL-инъекция[^] уязвимость, вы также храните пароли в обычном тексте. Не делай этого.

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

1 Ответов

Рейтинг:
4

Patrice T

String query = "SELECT * FROM userdatabase.userdatabasetable Where username = '"+user+"' AND password = '"+pass+"' ";

Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


yusof26

Большое вам спасибо за ваш совет я очень ценю его