Falha na checagem de login e senha pelo MySql[resolvido]

Olá a todos.

Descobri que basta digitar dados no campo login para que tenha acesso em meu projeto.
E o pior de tudo, que nem precisa ser um login do banco, pode ser um que não exista.

[code]<%–
Document : verificar_login_administracao
Created on : 19/09/2008, 15:19:46
Author : dark123
–%>

<%@page import=“java.sql.*”%>
<%@page contentType=“text/html” pageEncoding=“UTF-8”%>

<%
// captura parâmetros
String sLoginAdm = request.getParameter(“loginadm”);
String sSenhaAdm = request.getParameter(“senhaadm”);
%>

<% // grava sessão ***
session.putValue(“login_adm”, sLoginAdm); //Grava a session com o Login
session.putValue(“senha_adm”, sSenhaAdm); //Grava a session com o Login
%>

<%
Connection connection = null;

try {
String driverName = “org.gjt.mm.mysql.Driver”; // também poderia ser com.mysql.jdbc.Driver
Class.forName(driverName);

String serverName = "localhost";
String mydatabase = "banco";

String url = "jdbc:mysql://" +serverName+ "/" +mydatabase;
String username = "user";
String password = "pass";
connection = java.sql.DriverManager. getConnection(url, username, password);

} catch(ClassNotFoundException cnfex) {
out.println("Não foi possível encontrar o driver: " +cnfex.toString());
} catch (java.sql.SQLException sqlex) {
out.println("Erro ao conectar-se ao banco de dados: " +sqlex.toString());
}

//envia comando de verificação de login
try {
java.sql.Statement stmt = connection.createStatement();
java.sql.ResultSet rs = stmt.executeQuery(“SELECT cod, login, senha, nome FROM administrador “+
“WHERE login =’”+sLoginAdm+”’;”);

// Verifica se o resultset retornou nenhuma linha *****
rs.last();
if (rs.getRow()==0) { //zero linhas
    %> <jsp:forward page="login_administracao.jsp" />
    <% return;
    }

/* Este comando somente retornará no máximo um elemento, 
 *  pois login deve ser um campo UNIQUE ******/
rs.first();

// Verifica se a senha obtida no banco confere com o parâmetro *****
if (!rs.getString("senha").equals(sSenhaAdm)) {  // *** senha não confere
    %> <jsp:forward page="login_administracao.jsp" />
    <%  
} 
else {  // OK, usuário logado!     
    response.sendRedirect("administracao.jsp");
    stmt.close();
    connection.close();
    }
} catch (java.sql.SQLException sqlex) {
        out.println("Erro ao realizar login: " +sqlex.toString());
        }

%>[/code]

E antes eu achei que fosse SqlInjection. :shock:

Como eu poderia fazer a checagem da maneira correta?

Obrigado.

[]s.

[quote=dark123]Olá a todos.

Descobri . Bastava retirar este trecho:

<% session.putValue("login_adm", sLoginAdm); //Grava a session com o Login session.putValue("senha_adm", sSenhaAdm); //Grava a session com o Login %>

E adicionar dentro do else de usuário logado.

else { // OK, usuário logado! <% // grava sessão *** session.putValue("login_adm", sLoginAdm); //Grava a session com o Login session.putValue("senha_adm", sSenhaAdm); //Grava a session com o Login %>

Pois assim não cria uma sessão pra um usuário que não está no banco.

O ideal não seria checar usuário e senha para ver se da o match em apenas 1 linha do banco assim.

java.sql.ResultSet rs = stmt.executeQuery("SELECT cod, login, senha, nome FROM administrador "+ "WHERE login ='"+sLoginAdm+" and senha = "+sSenhaAdm+"';");

Eu sei, por isso fiz uma checagem com
o login e outra apenas para a senha ^^.

Deste modo, espero que seja ainda mais seguro.

[]s.

Oi,

Sei que já “resolveu” seu problema, mas gostaria de alertar para duas coisas:

  1. SQL Injection - Repare o esforço que teve que fazer para tratar isso, correndo o risco mesmo assim de sofrer alguma ameaça. Prefira Prepared Statement.

  2. Scriptlet - Esta abordagem de inserir em seus JSPs código Java não é aconselhável, pesquise sobre o padrão MVC que irá te ajudar a construir a VIEW de maneira menos acoplada com outras partes do sistema como acesso a dados, validações, regra de negócio…

Sim, sim, já estou dando uma lida.

Também vou usar servlets pra fazer isso.

Mas obrigado pelo aviso. =]