← PHP

Sistema de Login

Lida 8207 vezes

Offline

mr.max 
Membro
Mensagens 307 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

Olá.

Eu estou a tentar fazer algo simples mas que tem algo que não sei fazer, preciso de fazer um script ir buscar os dados a uma base de dados minha para fazer login.

Ele funciona assim:
http://www.site.com/a/login_chat.php?username=%username%&password=%password%

A conexão e tudo foi feito, o problema é a senha, ele não vai buscar a senha certa, pois elas estão encriptadas na base de dados.

Exemplo, se a senha for teste, só aceita e86b9a7a9927f0138436de0d6a7bff72 que é o que está na base de dados!

Como consigo fazer isto bem?
Offline

kaydara 
Membro
Mensagens 616 Gostos 1
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

tens de saber se é md5 ou whatever


e na query á db fazes algo como... and password = MD5('user insert password');
Offline

Ivo Pereira 
Membro
Mensagens 661 Gostos 1
Feedback +7

Troféus totais: 27
Trófeus: (Ver todos)
Linux User Super Combination Combination Topic Starter Level 5 Level 4 Level 3 Level 2 Level 1 500 Posts

Antes de verificares a senha da base de dados, tens que encriptar a que o utilizador enviou, e depois sim comparas ambas encriptadas.

Um conselho, utiliza o método $_POST em vez do $_GET para fazeres isso.
Offline

mr.max 
Membro
Mensagens 307 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

tens de saber se é md5 ou whatever


e na query á db fazes algo como... and password = MD5('user insert password');
Antes de verificares a senha da base de dados, tens que encriptar a que o utilizador enviou, e depois sim comparas ambas encriptadas.

Um conselho, utiliza o método $_POST em vez do $_GET para fazeres isso.

Olá, eu não percebo quase nada disso, utilizei um sistema pré-feito que vai ligar à base de dados e só tenho que indicar as tabelas, etc...

Código: [Seleccione]
<?php

/**
 * please modify the database configuration
 */
$dbhost "localhost";
$dbuser "XXXXX";
$dbpasswd "XXXXX";
$dbname "XXXXX";

$usertable "users";
$username_field "username";
$password_field "password";

// dbms - database type
// support dbms: mysql , mysql4 , db2, msaccess, mssql-odbc, oracle, postgres7
$dbms "mysql4";


$phpEx "php";
$lib_path ".";


/**
 * Don't modify the code below unless you know what are you doing.
 */

// Define the output result
$LOGIN_SUCCESS 0;
$LOGIN_PASSWD_ERROR 1;
$LOGIN_NICK_EXIST 2;
$LOGIN_ERROR 3;
$LOGIN_ERROR_NOUSERID 4;
$LOGIN_SUCCESS_ADMIN 5;
$LOGIN_NOT_ALLOW_GUEST 6;
$LOGIN_USER_BANED 7;

switch(
$dbms)
{
case 'mysql':
include($lib_path '/mysql.'.$phpEx);
break;

case 'mysql4':
include($lib_path '/mysql4.'.$phpEx);
break;

case 'postgres':
include($lib_path '/postgres7.'.$phpEx);
break;

case 'mssql':
include($lib_path '/mssql.'.$phpEx);
break;

case 'oracle':
include($lib_path '/oracle.'.$phpEx);
break;

case 'msaccess':
include($lib_path '/msaccess.'.$phpEx);
break;

case 'mssql-odbc':
include($lib_path '/mssql-odbc.'.$phpEx);
break;
default:
echo $LOGIN_ERROR;
exit;
}


// Make the database connection.
$db = new sql_db($dbhost$dbuser$dbpasswd$dbnamefalse);
if(!
$db->db_connect_id)
{
   echo 
$LOGIN_ERROR;
   exit;
}


$username = isset($HTTP_GET_VARS['username']) ? trim(htmlspecialchars($HTTP_GET_VARS['username'])) : '';
$username substr(str_replace("\\'""'"$username), 025);
$username str_replace("'""\\'"$username);
$password = isset($HTTP_GET_VARS['password']) ? $HTTP_GET_VARS['password'] : '';
//$md5 = isset($HTTP_GET_VARS['md5']) ? $HTTP_GET_VARS['md5'] : ''; 

$sql "SELECT " $username_field ." , "$password_field "
 FROM " 
$usertable "
WHERE "
$username_field " = '" str_replace("\\'""''"$username) . "'";


if ( !(
$result $db->sql_query($sql)) )
{
echo $LOGIN_ERROR;
exit;
}

if( 
$row $db->sql_fetchrow($result) )
{
$db_user_password $row[$password_field];

if (($password == $db_user_password) || (md5($password) == $db_user_password))
{
echo $LOGIN_SUCCESS;
exit;
}
else
{
echo $LOGIN_PASSWD_ERROR;
exit;
}

}
else
{
echo $LOGIN_ERROR_NOUSERID;
exit;
}



?>
Offline

defcrash 
Membro
Mensagens 79 Gostos 0
Feedback +1

Troféus totais: 17
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 50 Posts 10 Posts First Post Karma

Como já te disserem aqui tens que saber que encriptação é que estás a usar nas passwords que estão na base de dados.

Vou-te dar um pequeno exemplo, tu dizes que na tua base de dados para a password teste é e86b9a7a9927f0138436de0d6a7bff72, sendo assim:

teste = e86b9a7a9927f0138436de0d6a7bff72

Retirando isto do teu código que colocaste aí:

Código: [Seleccione]
if (($password == $db_user_password) || (md5($password) == $db_user_password))
{
echo $LOGIN_SUCCESS;
exit;
}

Este pequeno código está a fazer o seguinte:

SE a password que foi colocada no campo pelo utilizador for igual à password que está na base de dados OU a password encriptada em md5 da password colocada no campo pelo utilizador for igual à password que está na base de dados ele vai apresentar a mensagem de login com sucesso.

Vamos agora fazer as comparações manuais desse pequeno código:

password colocada pelo utilizador = teste é igual à password que está na base de dados? Não, porque teste não é igual a e86b9a7a9927f0138436de0d6a7bff72 depois ele vai ver se a password encriptada em md5 é igual, a password teste encriptada em md5 é 698dc19d489c4e4db73e28a713eab07b, então 698dc19d489c4e4db73e28a713eab07b é igual a e86b9a7a9927f0138436de0d6a7bff72? Também não, logo não vai estar a fazer login nenhum.

Não sei se me fiz entender, mas primeiro deves tentar saber que encriptação é que tens na base de dados e só depois é que se deverá olhar melhor para o resto do código de forma a fazê-lo funcionar.


Abraço.

Offline

mr.max 
Membro
Mensagens 307 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

Como já te disserem aqui tens que saber que encriptação é que estás a usar nas passwords que estão na base de dados.

Vou-te dar um pequeno exemplo, tu dizes que na tua base de dados para a password teste é e86b9a7a9927f0138436de0d6a7bff72, sendo assim:

teste = e86b9a7a9927f0138436de0d6a7bff72

Retirando isto do teu código que colocaste aí:

Código: [Seleccione]
if (($password == $db_user_password) || (md5($password) == $db_user_password))
{
echo $LOGIN_SUCCESS;
exit;
}

Este pequeno código está a fazer o seguinte:

SE a password que foi colocada no campo pelo utilizador for igual à password que está na base de dados OU a password encriptada em md5 da password colocada no campo pelo utilizador for igual à password que está na base de dados ele vai apresentar a mensagem de login com sucesso.

Vamos agora fazer as comparações manuais desse pequeno código:

password colocada pelo utilizador = teste é igual à password que está na base de dados? Não, porque teste não é igual a e86b9a7a9927f0138436de0d6a7bff72 depois ele vai ver se a password encriptada em md5 é igual, a password teste encriptada em md5 é 698dc19d489c4e4db73e28a713eab07b, então 698dc19d489c4e4db73e28a713eab07b é igual a e86b9a7a9927f0138436de0d6a7bff72? Também não, logo não vai estar a fazer login nenhum.

Não sei se me fiz entender, mas primeiro deves tentar saber que encriptação é que tens na base de dados e só depois é que se deverá olhar melhor para o resto do código de forma a fazê-lo funcionar.


Abraço.



Do que eu entendi, por exemplo, 2 utilizadores com senha teste, na base de dados:
ef03dc979fc238da785dbd0893163894

De resto, não sei o que fazer com isso para colocar o que quero a funcionar. :)
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Do que eu entendi, por exemplo, 2 utilizadores com senha teste, na base de dados:
ef03dc979fc238da785dbd0893163894

De resto, não sei o que fazer com isso para colocar o que quero a funcionar. :)

Deixa aqui o código da página para inserir os dados na BD..
Offline

defcrash 
Membro
Mensagens 79 Gostos 0
Feedback +1

Troféus totais: 17
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 50 Posts 10 Posts First Post Karma

Do que eu entendi, por exemplo, 2 utilizadores com senha teste, na base de dados:
ef03dc979fc238da785dbd0893163894

No inicio tinhas dito que teste era e86b9a7a9927f0138436de0d6a7bff72 agora já é ef03dc979fc238da785dbd0893163894? Não terás a usar salt? Fazendo com que a mesma password tenham resultados diferentes?

Diz-nos outra coisa, o que é que está a guardar as passwords na base de dados, ou seja, os utilizadores registam-se através de quê?
Offline

mr.max 
Membro
Mensagens 307 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

No inicio tinhas dito que teste era e86b9a7a9927f0138436de0d6a7bff72 agora já é ef03dc979fc238da785dbd0893163894? Não terás a usar salt? Fazendo com que a mesma password tenham resultados diferentes?

Diz-nos outra coisa, o que é que está a guardar as passwords na base de dados, ou seja, os utilizadores registam-se através de quê?

Dum script, faz os cadastros, logins.... mas teste é mesmo pois a outra era diferente, criei 2 com teste e deu a mesmo resultado. O script encripta as senhas, mas esse script que vai acessar a base de dados não dá para configurar para fazer login corretamente?
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Dum script, faz os cadastros, logins.... mas teste é mesmo pois a outra era diferente, criei 2 com teste e deu a mesmo resultado. O script encripta as senhas, mas esse script que vai acessar a base de dados não dá para configurar para fazer login corretamente?

Deixa aqui o script. Ou pelo menos o código do script.
Offline

mr.max 
Membro
Mensagens 307 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

Offline

defcrash 
Membro
Mensagens 79 Gostos 0
Feedback +1

Troféus totais: 17
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 50 Posts 10 Posts First Post Karma

Esse script usa md5, mas tem salt também, no ficheiro class.uFlex.php tem lá definido a salt:

Código: [Seleccione]
const salt = "sd5a4";
Que deves alterar para um valor à tua escolha.

Depois quando ele regista um novo utilizador faz:

Código: [Seleccione]
    function register($info,$activation = false){
        $this->logger("registration"); //Index for Errors and Reports

        //Saves Registration Data in Class
        $this->tmp_data = $info;

        //Validate All Fields
        if(!$this->validateAll()) return false; //There are validations error

        //Built in actions for special fields
        //Hash Password
        if(isset($info['password'])){
            $this->hash_pass($info['password']);
            $info['password'] = $this->pass;
        }
        //Check for Email in database
        if(isset($info['email']))
            if($this->check_field('email',$info['email'],"This Email is Already in Use"))
                return false;

        //Check for username in database
        if(isset($info['username']))
            if($this->check_field('username',$info['username'], "This Username is not available"))
                return false;

        //Check for errors
        if($this->has_error()) return false;

        //Set Registration Date
        $info['reg_date'] = time();

        //User Activation
        if(!$activation){ //Activates user upon registration
            $info['activated'] = 1;
        }

        //Prepare Info for SQL Insertion
        foreach($info as $index => $val){
            if(!preg_match("/2$/",$index)){ //Skips double fields
                $into[] = $index;
                $values[] = "'".mysql_real_escape_string($val)."'";
            }
        }

        $into = implode(", ",$into);
        $values = implode(",",$values);

        //Prepare New User Query
        $sql = "INSERT INTO {$this->opt['table_name']} ($into)
VALUES($values)";
        //exit($sql);

        //Enter New user to Database
        if($this->check_sql($sql)){
            $this->report("New User \"{$info['username']}\" has been registered");
            $this->id = mysql_insert_id();
            if($activation){
                //Insert Validation Hash
                $this->make_hash($this->id);
                $this->save_hash();
                return $this->confirm;
            }
            return true;
        }else{
            $this->error(1);
            return false;
        }
    }

Aqui fica a função hash_pass que codifica a password:

Código: [Seleccione]
    function hash_pass($pass){
        $salt = uFlex::salt;
        $this->pass = md5($salt.$pass.$salt);
        return $this->pass;
    }

Ou seja, quando colocas teste como password ele vai codificar em md5 da seguinte forma: sd5a4testesd5a4 que dá ef03dc979fc238da785dbd0893163894 que é o que tinhas colocado acima.


Agora que olhei para o link que colocaste fiquei sem perceber o que pretendes fazer ao certo?
Offline

mr.max 
Membro
Mensagens 307 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

Esse script usa md5, mas tem salt também, no ficheiro class.uFlex.php tem lá definido a salt:

Código: [Seleccione]
const salt = "sd5a4";
Que deves alterar para um valor à tua escolha.

Depois quando ele regista um novo utilizador faz:

Código: [Seleccione]
    function register($info,$activation = false){
        $this->logger("registration"); //Index for Errors and Reports

        //Saves Registration Data in Class
        $this->tmp_data = $info;

        //Validate All Fields
        if(!$this->validateAll()) return false; //There are validations error

        //Built in actions for special fields
        //Hash Password
        if(isset($info['password'])){
            $this->hash_pass($info['password']);
            $info['password'] = $this->pass;
        }
        //Check for Email in database
        if(isset($info['email']))
            if($this->check_field('email',$info['email'],"This Email is Already in Use"))
                return false;

        //Check for username in database
        if(isset($info['username']))
            if($this->check_field('username',$info['username'], "This Username is not available"))
                return false;

        //Check for errors
        if($this->has_error()) return false;

        //Set Registration Date
        $info['reg_date'] = time();

        //User Activation
        if(!$activation){ //Activates user upon registration
            $info['activated'] = 1;
        }

        //Prepare Info for SQL Insertion
        foreach($info as $index => $val){
            if(!preg_match("/2$/",$index)){ //Skips double fields
                $into[] = $index;
                $values[] = "'".mysql_real_escape_string($val)."'";
            }
        }

        $into = implode(", ",$into);
        $values = implode(",",$values);

        //Prepare New User Query
        $sql = "INSERT INTO {$this->opt['table_name']} ($into)
VALUES($values)";
        //exit($sql);

        //Enter New user to Database
        if($this->check_sql($sql)){
            $this->report("New User \"{$info['username']}\" has been registered");
            $this->id = mysql_insert_id();
            if($activation){
                //Insert Validation Hash
                $this->make_hash($this->id);
                $this->save_hash();
                return $this->confirm;
            }
            return true;
        }else{
            $this->error(1);
            return false;
        }
    }

Aqui fica a função hash_pass que codifica a password:

Código: [Seleccione]
    function hash_pass($pass){
        $salt = uFlex::salt;
        $this->pass = md5($salt.$pass.$salt);
        return $this->pass;
    }

Ou seja, quando colocas teste como password ele vai codificar em md5 da seguinte forma: sd5a4testesd5a4 que dá ef03dc979fc238da785dbd0893163894 que é o que tinhas colocado acima.


Agora que olhei para o link que colocaste fiquei sem perceber o que pretendes fazer ao certo?

Acho que vou fazer algo mais simples, instalo o Joomla, tem o sistema pré-feito e instalo o addon para integrar, mais simples não? :)

O joomla é leve certo? ou seria melhor wordpress?
Offline

mr.max 
Membro
Mensagens 307 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

Esse script usa md5, mas tem salt também, no ficheiro class.uFlex.php tem lá definido a salt:

Código: [Seleccione]
const salt = "sd5a4";
Que deves alterar para um valor à tua escolha.

Depois quando ele regista um novo utilizador faz:

Código: [Seleccione]
    function register($info,$activation = false){
        $this->logger("registration"); //Index for Errors and Reports

        //Saves Registration Data in Class
        $this->tmp_data = $info;

        //Validate All Fields
        if(!$this->validateAll()) return false; //There are validations error

        //Built in actions for special fields
        //Hash Password
        if(isset($info['password'])){
            $this->hash_pass($info['password']);
            $info['password'] = $this->pass;
        }
        //Check for Email in database
        if(isset($info['email']))
            if($this->check_field('email',$info['email'],"This Email is Already in Use"))
                return false;

        //Check for username in database
        if(isset($info['username']))
            if($this->check_field('username',$info['username'], "This Username is not available"))
                return false;

        //Check for errors
        if($this->has_error()) return false;

        //Set Registration Date
        $info['reg_date'] = time();

        //User Activation
        if(!$activation){ //Activates user upon registration
            $info['activated'] = 1;
        }

        //Prepare Info for SQL Insertion
        foreach($info as $index => $val){
            if(!preg_match("/2$/",$index)){ //Skips double fields
                $into[] = $index;
                $values[] = "'".mysql_real_escape_string($val)."'";
            }
        }

        $into = implode(", ",$into);
        $values = implode(",",$values);

        //Prepare New User Query
        $sql = "INSERT INTO {$this->opt['table_name']} ($into)
VALUES($values)";
        //exit($sql);

        //Enter New user to Database
        if($this->check_sql($sql)){
            $this->report("New User \"{$info['username']}\" has been registered");
            $this->id = mysql_insert_id();
            if($activation){
                //Insert Validation Hash
                $this->make_hash($this->id);
                $this->save_hash();
                return $this->confirm;
            }
            return true;
        }else{
            $this->error(1);
            return false;
        }
    }

Aqui fica a função hash_pass que codifica a password:

Código: [Seleccione]
    function hash_pass($pass){
        $salt = uFlex::salt;
        $this->pass = md5($salt.$pass.$salt);
        return $this->pass;
    }

Ou seja, quando colocas teste como password ele vai codificar em md5 da seguinte forma: sd5a4testesd5a4 que dá ef03dc979fc238da785dbd0893163894 que é o que tinhas colocado acima.


Agora que olhei para o link que colocaste fiquei sem perceber o que pretendes fazer ao certo?


mas não posso fazer nada agora, desativei TODOS os meus sites na conta de alojamento, e no cPanel vi o CPU e a Memoria a 1GB, em mais um pico de consumo, já mandei é reclamação na Host que falava que o que causava isto era o fórum e afinal ... D:
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

O que é que tu queres fazer? Não vale a pena reinventar a roda, provavelmente o Wordpress serve perfeitamente.

Caso não sirva, o melhor é usares outro sistema de login mais simples, senão vais andar sempre à cabeçada com o PHP..