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

5 respostas
D

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.

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

E antes eu achei que fosse SqlInjection. :shock:

Como eu poderia fazer a checagem da maneira correta?

Obrigado.

[]s.

5 Respostas

D

[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.

leonardonaweb

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

D

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.

rafaelglauber

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…

D

Sim, sim, já estou dando uma lida.

Também vou usar servlets pra fazer isso.

Mas obrigado pelo aviso. =]

Criado 19 de outubro de 2008
Ultima resposta 22 de out. de 2008
Respostas 5
Participantes 3