Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Frehley

[Resolvido] Como inserir hash em um Sistema de Login com php e my

Recommended Posts

Olá galera! estou com uma dúvida o quanto um pouco complicada!

 

eu segui esse tutorial de login, afinal sou iniciante

 

http://blog.thiagobelem.net/criando-um-sistema-de-login-com-php-e-mysql/

 

Por mais que eu tenha seguido a lógica, não consigo inserir uma hash para consultar a minha senha;

 

Eu consigo cadastrar a senha "hasheada" porém consultar não vai nem a pau!

 

a Hash utilizada foi sha512

 

Lembrando que o login funciona perfeitamente, porém eu tenho que cadastrar uma senha "sem segurança" facilitando futuras invasões.

 

eu tentei fazer isso:

 

valida.php

<?php

// Inclui o arquivo com o sistema de segurança
include("seguranca.php");

// Verifica se um formulário foi enviado
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Salva duas variáveis com o que foi digitado no formulário
// Detalhe: faz uma verificação com isset() pra saber se o campo foi preenchido
$usuario = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';
$senha = (isset(hash('sha512',$_POST['senha'])) ? hash('sha512',$_POST['senha']) : '';

// Utiliza uma função criada no seguranca.php pra validar os dados digitados
if (validaUsuario($usuario, $senha) == true) {
// O usuário e a senha digitados foram validados, manda pra página interna
header("Location: index.php");
} else {
// O usuário e/ou a senha são inválidos, manda de volta pro form de login
// Para alterar o endereço da página de login, verifique o arquivo seguranca.php
expulsaVisitante();
}
}
?>

 

Retornou o erro

 

Fatal error: Can't use function return value in write context in C:\*****\valida.php on line 11

 

 

Alguém sugere algo melhor? =// agradeceria!! obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você fez uma confusão de lógica no conteudo do if ternario da variavel $senha, você está verificando se o hash existe (o que logicamente nunca vai existir). Você tem que fazer assim:

 

- Verificar se existe a variavel $_POST['senha']

- Se ela existir faca a criptografia hash('sha512',$_POST['senha'])

- Se nao existir não faca nada.

 

 // Primeiro você verifica SE EXISTE o POST ? SE EXISTIR faz a criptografia : SE NAO EXISTIR não faz nada.
 $senha = (isset($_POST['senha'])) ? hash('sha512',$_POST['senha']) : '';

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então eu tentei, porém substituindo a linha 11 pelo código que você envio, infelizmente não loga, faz nada, porem se deixar como antes (igual tutorial) funcional normalmente =/. eu achei esse tutorial bom porém tá pecando nessa função. tem mais alguém que poderia me ajudar?? obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvemos o problema da linha 11 @isset, mas agora o problema está no $_POST['senha'] e/ou na verificação com o banco de dados, em baixo da variavel senha faça isso:

 

echo '<pre>';
 var_dump($_POST['senha'], $_POST['usuario'], $senha);
echo '</pre>';

 

Veja os valores que estão vindo do $_POST e o valor de $senha e compara no banco de dados para ver se é isso mesmo e coloque o resultado aqui.

 

Abraços e até mais :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu problema é que Um Hash SHA-512 Tem uma Conjunto de Letras e Numeros Maior Que X Characters ..

Para Isso Você Mesmo Pode Ver,

 printf("Quantidade De Characters <b>%d</b> Para O Hash %s", strlen(hash('sha512', "Teste")), hash('sha512', "Teste"));

 

No Caso o Retorno Foi

Quantidade De Caracters 128 Para
71a7676bf290b689fc7e6d5d89aba42ef012a448f9226b0667ca5d0fc0d5adfe9e5883b412d42d05584274ad5f8915deb222be781c52ce1f9a61574ed09ca3ca

 

Desde Então Sua Tabela so Suporta 50 Characters

 

Como no SQL Postado No Blog

DROP TABLE IF EXISTS `usuarios`;
CREATE TABLE IF NOT EXISTS `usuarios` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nome` varchar(100) NOT NULL,
`usuario` varchar(50) NOT NULL,
`senha` varchar(50) NOT NULL, -- Aqui que esta o problema
PRIMARY KEY (`id`),
UNIQUE KEY `usuario` (`usuario`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

Nisso , já se pode concluir que você esta gerando um Hash Maior Do Que o Permitido Na Tabela

Ou Seja a Comparação vai Ser Sempre Invalida , Pois Você no PHP , Você gera um Hash com a senha Digitada

Nesse Hash Tem Mais de 110 Caracters , E NO Banco So Tem 50, Porque não é permitido Inserir Mais

Então Seu Hash é Invalido ao Comprar com o Banco :) , Altere Seu Hash para um Sha1 Normal, ou Aumente o tamanho do Campo Na Tabela

 

:Pergunta , Porque Usar um Hash tão Longo, Para uma coisa tão basica .. Como um sistema de login ?

Tem algum motivo Em Especial no qual você deseja Segurança maxima , Porque não um sha1 ..

Até hoje uso Ele e nunca tive nenhum Problema .. :joia:

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas então, eu aumentei o tamanho da tabela e continua dando o mesmo erro. esse var_dump onde eu posso colocar? eu coloquei abaixo do isset como o André informou e ele retornou as strings corretamente, e até a hash com os 128 caracteres. e agora? =/ eu estou tentando de tudo mas tá tenso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, Mais você mandou criptografar ao gravar no banco de dados

e verificou na hora de comprar as senhas tambem ?

 

sim registra criptografado o problema eh para verificar ele não enxerga a hash...

Compartilhar este post


Link para o post
Compartilhar em outros sites

o tutorial é o mesmo eu só editei o valida.php

 

valida.php

<?php

// Inclui o arquivo com o sistema de segurança
include("seguranca.php");

// Verifica se um formulário foi enviado
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Salva duas variáveis com o que foi digitado no formulário
// Detalhe: faz uma verificação com isset() pra saber se o campo foi preenchido
$usuario = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';
// Foi aki que eu editei...
$senha = (isset($_POST['senha'])) ? hash('sha512',$_POST['senha']) : '';

// Utiliza uma função criada no seguranca.php pra validar os dados digitados
if (validaUsuario($usuario, $senha) == true) {
// O usuário e a senha digitados foram validados, manda pra página interna
header("Location: index.php");
} else {
// O usuário e/ou a senha são inválidos, manda de volta pro form de login
// Para alterar o endereço da página de login, verifique o arquivo seguranca.php
expulsaVisitante();
}
}

?>

 

a hash é gerado quando eu insiro no banco de dados eu criei um form que leva para a página register.php e ficou assim:

 

<?php
$nome = 	$_POST['nome'];
$usuario = 	$_POST['usuario'];
$pass1 = 	hash('sha512',$_POST['pass1']);  //aki eh onde gera a hash.

$dbhost = 	'localhost'; //editei o dados por privacidade.
$dbname = 	''; 
$dbuser = 	'';
$dbpass = 	''; 

$conn = mysql_connect($dbhost, $dbuser, $dbpass);  mysql_select_db($dbname, $conn);

$usuario = mysql_real_escape_string($usuario);
$query = "INSERT INTO usuarios ( nome, usuario, senha ) VALUES ( '$nome', '$usuario' , '$pass1');";
mysql_query($query);
mysql_close();
header('Location: index.php');
?>

 

Lembrando que o Registro é feito com sucesso o erro é consultar com a hash! Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vixiiii, Você Nen Postou Todaas as Funçoes

Meio Dificil Ajudar Assim =) , Mais Beleza ..

Fiz esse sistema aqui Pra Você .. Qualquer Duvida Pode Falar,

 

<?php
 if(!isset( $_SESSION )){
        session_start();
 }
?>
<form method="POST" action="">
      <label for="login">Login</label><br />
        <input type="text" name="login" size="28 " /><br />
      <label for="senha">Senha</label><br />
        <input type="password" name="senha" size="28" /><br />
        <input type="submit" name="doLogin" value="Fazer Login" />
</form>
<?php
  if( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_POST['doLogin'] ) ){
         $login = isset( $_POST['login'] ) ? strip_tags(addslashes( $_POST['login'] )) : NULL;
         $senha = isset( $_POST['senha'] ) ? strip_tags(addslashes( $_POST['senha'] )) : NULL;
         // ... Validações se Neccessario
         $SQL = new PDO( 'mysql:host=localhost;dbname=nome do banco;port=3306', 'root', 'sua senha' );
         if( $SQL instanceOf PDO ){
                $SQL->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
                $SQL->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );
                $SQL->setAttribute( PDO::ATTR_TIMEOUT, 10 );
                $SQL->setAttribute( PDO::ATTR_AUTOCOMMIT, true );
         }
         try{
               $valida = $SQL->prepare( "SELECT * FROM `usuarios` WHERE `usuario` = :usuario AND `senha` = :senha" );
               $valida->bindParam( ':usuario', $login, PDO::PARAM_STR );
               $valida->bindParam( ':senha', hash('sha512', $senha), PDO::PARAM_STR );
               $valida->execute();
               if( $valida->rowCount() == 1 ){
                   $dados = $valida->fetch();
                   $_SESSION['id'] = $dados['id'];
                   $_SESSION['nome'] = $dados['nome'];
                   /**
                    * ...
                    * Se Você Quiser Gravar Mais Informaçoes na Sessão
                    * Basta Seguir o Procedimento Acima, Pegando os Valores
                    * No Array do Usuario Correspondente ao Usuario Autenticado
                    */
               }else{
                      echo 'Login ou Senha Inválidos ... ';
                      exit;
               }
         }catch( PDOException $Error ){
                 printf( "Um Erro Occoreu: %s, Codigo Do Erro: %d, No Arquivo %s", $Error->getMessage(), $Error->getCode(), $Error->getFile() );
         }
  }
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

então o restante das funções está aki (o msm do site):

 

/**
* Sistema de segurança com acesso restrito
*
* Usado para restringir o acesso de certas páginas do seu site
*
* @author Thiago Belem <contato@thiagobelem.net>
* @link http://thiagobelem.net/
*
* @version 1.0
* @package SistemaSeguranca
*/

//  Configurações do Script
// ==============================
$_SG['conectaServidor'] = true;    // Abre uma conexão com o servidor MySQL?
$_SG['abreSessao'] = true;         // Inicia a sessão com um session_start()?

$_SG['caseSensitive'] = false;     // Usar case-sensitive? Onde 'thiago' é diferente de 'THIAGO'

$_SG['validaSempre'] = true;       // Deseja validar o usuário e a senha a cada carregamento de página?
// Evita que, ao mudar os dados do usuário no banco de dado o mesmo contiue logado.

$_SG['servidor'] = 'localhost';    // Servidor MySQL
$_SG['usuario'] = 'root';          // Usuário MySQL
$_SG['senha'] = '';                // Senha MySQL
$_SG['banco'] = 'test';            // Banco de dados MySQL

$_SG['paginaLogin'] = 'login.php'; // Página de login

$_SG['tabela'] = 'usuarios';       // Nome da tabela onde os usuários são salvos
// ==============================

// ======================================
//   ~ Não edite a partir deste ponto ~
// ======================================

// Verifica se precisa fazer a conexão com o MySQL
if ($_SG['conectaServidor'] == true) {
$_SG['link'] = mysql_connect($_SG['servidor'], $_SG['usuario'], $_SG['senha']) or die("MySQL: Não foi possível conectar-se ao servidor [".$_SG['servidor']."].");
mysql_select_db($_SG['banco'], $_SG['link']) or die("MySQL: Não foi possível conectar-se ao banco de dados [".$_SG['banco']."].");
}

// Verifica se precisa iniciar a sessão
if ($_SG['abreSessao'] == true) {
session_start();
}

/**
* Função que valida um usuário e senha
*
* @param string $usuario - O usuário a ser validado
* @param string $senha - A senha a ser validada
*
* @return bool - Se o usuário foi validado ou não (true/false)
*/
function validaUsuario($usuario, $senha) {
global $_SG;

$cS = ($_SG['caseSensitive']) ? 'BINARY' : '';

// Usa a função addslashes para escapar as aspas
$nusuario = addslashes($usuario);
$nsenha = addslashes($senha);

// Monta uma consulta SQL (query) para procurar um usuário
$sql = "SELECT `id`, `nome` FROM `".$_SG['tabela']."` WHERE ".$cS." `usuario` = '".$nusuario."' AND ".$cS." `senha` = '".$nsenha."' LIMIT 1";
$query = mysql_query($sql);
$resultado = mysql_fetch_assoc($query);

// Verifica se encontrou algum registro
if (empty($resultado)) {
// Nenhum registro foi encontrado => o usuário é inválido
return false;

} else {
// O registro foi encontrado => o usuário é valido

// Definimos dois valores na sessão com os dados do usuário
$_SESSION['usuarioID'] = $resultado['id']; // Pega o valor da coluna 'id do registro encontrado no MySQL
$_SESSION['usuarioNome'] = $resultado['nome']; // Pega o valor da coluna 'nome' do registro encontrado no MySQL

// Verifica a opção se sempre validar o login
if ($_SG['validaSempre'] == true) {
// Definimos dois valores na sessão com os dados do login
$_SESSION['usuarioLogin'] = $usuario;
$_SESSION['usuarioSenha'] = $senha;
}

return true;
}
}

/**
* Função que protege uma página
*/
function protegePagina() {
global $_SG;

if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
// Não há usuário logado, manda pra página de login
expulsaVisitante();
} else if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
// Há usuário logado, verifica se precisa validar o login novamente
if ($_SG['validaSempre'] == true) {
// Verifica se os dados salvos na sessão batem com os dados do banco de dados
if (!validaUsuario($_SESSION['usuarioLogin'], $_SESSION['usuarioSenha'])) {
// Os dados não batem, manda pra tela de login
expulsaVisitante();
}
}
}
}

/**
* Função para expulsar um visitante
*/
function expulsaVisitante() {
global $_SG;

// Remove as variáveis da sessão (caso elas existam)
unset($_SESSION['usuarioID'], $_SESSION['usuarioNome'], $_SESSION['usuarioLogin'], $_SESSION['usuarioSenha']);

// Manda pra tela de login
header("Location: ".$_SG['paginaLogin']);
}

 

o que voce fez como ele funciona, pq tipo eu procuro um sistema de login seguro apenas isso :P, mas não encontro com facilidade; basicamente seria

 

login -> valida (funções de session) -> index (todas as paginas para checar se ta logado ou não) apenas isso :P o do tutorial tá bom mas ta pecando em consultar com hash eh essa a dúvida!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, Verificar se está logado não e o problema ..

 if(!isset( $_SESSION['id'] )){
     header("Location: login.php");
     exit;
 }

O Codigo que eu postei faz isso, E Mais Apropiado do Que Usar

As funçoes nativas mysql_, ja que no PHP6 Não vão existir mais essas funçoes

Então com PDO É Mais Seguro Como já faz todo tratamento da SQL ..

Onde foi Exatamente sua Duvida ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simples o sistema que o cara utilizou ele não consulta com hash ou seja eu tenho que inserir meus dados sem nada: (senha: 123456) sendo vísivel para todos.

 

o seu sistema então funciona assim?

 

páginas protegidas:

<?php
 if(!isset( $_SESSION['id'] )){
     header("Location: login.php");
     exit;
 }
?>

 

login:

<form method="POST" action="">
      <label for="login">Login</label><br />
        <input type="text" name="login" size="28 " /><br />
      <label for="senha">Senha</label><br />
        <input type="password" name="senha" size="28" /><br />
        <input type="submit" name="doLogin" value="Fazer Login" />
</form>

 

validar o login:

<?php
  if( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_POST['doLogin'] ) ){
         $login = isset( $_POST['login'] ) ? strip_tags(addslashes( $_POST['login'] )) : NULL;
         $senha = isset( $_POST['senha'] ) ? strip_tags(addslashes( $_POST['senha'] )) : NULL;
         // ... Validações se Neccessario
         $SQL = new PDO( 'mysql:host=localhost;dbname=nome do banco;port=3306', 'root', 'sua senha' );
         if( $SQL instanceOf PDO ){
                $SQL->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
                $SQL->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );
                $SQL->setAttribute( PDO::ATTR_TIMEOUT, 10 );
                $SQL->setAttribute( PDO::ATTR_AUTOCOMMIT, true );
         }
         try{
               $valida = $SQL->prepare( "SELECT * FROM `usuarios` WHERE `usuario` = :usuario AND `senha` = :senha" );
               $valida->bindParam( ':usuario', $login, PDO::PARAM_STR );
               $valida->bindParam( ':senha', hash('sha512', $senha), PDO::PARAM_STR );
               $valida->execute();
               if( $valida->rowCount() == 1 ){
                   $dados = $valida->fetch();
                   $_SESSION['id'] = $dados['id'];
                   $_SESSION['nome'] = $dados['nome'];
                   /**
                    * ...
                    * Se Você Quiser Gravar Mais Informaçoes na Sessão
                    * Basta Seguir o Procedimento Acima, Pegando os Valores
                    * No Array do Usuario Correspondente ao Usuario Autenticado
                    */
               }else{
                      echo 'Login ou Senha Inválidos ... ';
                      exit;
               }
         }catch( PDOException $Error ){
                 printf( "Um Erro Occoreu: %s, Codigo Do Erro: %d, No Arquivo %s", $Error->getMessage(), $Error->getCode(), $Error->getFile() );
         }
  }
?>

 

se for isso eu tentei aki

 

porém não entendi essa parte aki:

 

if( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_POST['doLogin'] ) ){

 

oq seria doLogin? :S (sim, estou iniciando por isso as perguntas idiotas)

 

eu troquei por doLogin por usuario (q eh o campo do form) ai retorna o erro "login ou usario invalido", apenas com doLogin, ele executa uma página branca então eu tentei botar um header abaixo e ficou assim:

 

 $_SESSION['id'] = $dados['id'];
$_SESSION['nome'] = $dados['nome'];
header("location: index.php");

 

porém sem sucesso =/ eu sei que deve está irritando todos, mas tipo é que estou tentando sério mesmo aprender eh isso! :( e essa porta do mysql eh padrão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloca no começo do código isso

 

echo $login.'<br>';
echo $senha.'<br>';

 

Veja o que foi impresso, abre o campo no banco de dados e olhe se os valores são iguais. Se for igual é sinal que o problema está na sua QUERY se for diferente o problema está na hora de inserir os valores.

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloca no começo do código isso

 

echo $login.'<br>';
echo $senha.'<br>';

 

Veja o que foi impresso, abre o campo no banco de dados e olhe se os valores são iguais. Se for igual é sinal que o problema está na sua QUERY se for diferente o problema está na hora de inserir os valores.

 

tá mais em qual arquivo!?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.