Autenticação de Usuário com JDBC em Java

A verificação de login é essencial em sistemas web. Este artigo demonstra como implementar autenticação básica usando JDBC em Java, analisando dois enfoqeus: concatenação direta de consultas SQL e a utilização segura de PreparedStatement para prevenir injeção de SQL.

Método 1: Concatenação Direta na Consulta SQL

Nesta abordagem, os valores de entrada são incorporados diretamente na string SQL. Este método é inseguro, pois é vulnerável a ataques de injeção de SQL.

import java.util.Scanner;
import java.sql.*;

public class AutenticacaoDireta {
    public static void main(String[] args) throws Exception {
        Scanner leitor = new Scanner(System.in);
        System.out.print("Usuário: ");
        String usuario = leitor.nextLine();
        System.out.print("Senha: ");
        String senha = leitor.nextLine();

        // Estabelecer conexão com o banco de dados
        Class.forName("com.mysql.jdbc.Driver");
        Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost:3306/banco_dados", "administrador", "");
        Statement stmt = conexao.createStatement();

        // Concatenação direta - propensa a injeção de SQL
        String sql = "SELECT * FROM cadastros WHERE login='" + usuario + "' AND chave='" + senha + "'";
        ResultSet rs = stmt.executeQuery(sql);

        if (rs.next()) {
            System.out.println("Autenticação bem-sucedida. Bem-vindo, " + rs.getString("nome") + "!");
        } else {
            System.out.println("Credenciais inválidas.");
        }
        conexao.close();
    }
}

Métoddo 2: Uso de PreparedStatement para Segurança

PreparedStatement utiliza consultas parametrizadas, eliminando riscos de injeção de SQL. Os valores são vincullados como parâmetros, garantindo a integridade da consulta.

import java.util.Scanner;
import java.sql.*;

public class AutenticacaoSegura {
    public static void main(String[] args) throws Exception {
        Scanner leitor = new Scanner(System.in);
        System.out.print("Usuário: ");
        String usuario = leitor.nextLine();
        System.out.print("Senha: ");
        String senha = leitor.nextLine();

        Class.forName("com.mysql.jdbc.Driver");
        Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost:3306/banco_dados", "administrador", "");
        String consulta = "SELECT * FROM cadastros WHERE login = ? AND chave = ?";
        PreparedStatement pstmt = conexao.prepareStatement(consulta);
        pstmt.setString(1, usuario);
        pstmt.setString(2, senha);
        ResultSet rs = pstmt.executeQuery();

        if (rs.next()) {
            System.out.println("Login efetuado com sucesso para o usuário " + rs.getString("nome"));
        } else {
            System.out.println("Falha na autenticação.");
        }
        conexao.close();
    }
}

Exemplo de Registro com PreparedStatement

Para operações de inserção, como registro de novos usuários, PreparedStatement também oferece proteção contra caracteres especiais e simplifica o código.

import java.util.Scanner;
import java.sql.*;

public class RegistrarUsuario {
    public static void main(String[] args) throws Exception {
        Scanner leitor = new Scanner(System.in);
        System.out.print("Novo login: ");
        String novoLogin = leitor.nextLine();
        System.out.print("Definir senha: ");
        String novaSenha = leitor.nextLine();
        System.out.print("Nome completo: ");
        String nome = leitor.nextLine();

        Class.forName("com.mysql.jdbc.Driver");
        Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost:3306/banco_dados?characterEncoding=UTF-8", "administrador", "");
        String insercao = "INSERT INTO cadastros (login, chave, nome) VALUES (?, ?, ?)";
        PreparedStatement pstmt = conexao.prepareStatement(insercao);
        pstmt.setString(1, novoLogin);
        pstmt.setString(2, novaSenha);
        pstmt.setString(3, nome);
        pstmt.executeUpdate();
        System.out.println("Registro concluído com êxito.");
        conexao.close();
    }
}

Tags: jdbc java MySQL SQL_Injection PreparedStatement

Publicado em 6-3 03:19 por Thomas