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();
}
}