Frehley 0 Denunciar post Postado Abril 17, 2011 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
André Severino 3 Denunciar post Postado Abril 17, 2011 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
Frehley 0 Denunciar post Postado Abril 17, 2011 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
André Severino 3 Denunciar post Postado Abril 17, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Abril 17, 2011 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
André Severino 3 Denunciar post Postado Abril 17, 2011 ARRAY NÃO É NULL Compartilhar este post Link para o post Compartilhar em outros sites
Frehley 0 Denunciar post Postado Abril 17, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Abril 17, 2011 Poste seu sistema de Login Completo Aqui .. Compartilhar este post Link para o post Compartilhar em outros sites
Frehley 0 Denunciar post Postado Abril 17, 2011 o código é o mesmo que desse site: http://blog.thiagobe...om-php-e-mysql/ a única diferença é o tamanho da tabela e editei a linha 11 acima como o Andrey informou! Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Abril 17, 2011 Então, Mais você mandou criptografar ao gravar no banco de dados e verificou na hora de comprar as senhas tambem ? Compartilhar este post Link para o post Compartilhar em outros sites
Frehley 0 Denunciar post Postado Abril 17, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Abril 17, 2011 Novamente, vou pedir que poste seu codigo aqui .. Com as suas modificaçoes . Compartilhar este post Link para o post Compartilhar em outros sites
Frehley 0 Denunciar post Postado Abril 17, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Abril 17, 2011 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
Frehley 0 Denunciar post Postado Abril 17, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Abril 17, 2011 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
Frehley 0 Denunciar post Postado Abril 17, 2011 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
André Severino 3 Denunciar post Postado Abril 17, 2011 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
Frehley 0 Denunciar post Postado Abril 18, 2011 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
André Severino 3 Denunciar post Postado Abril 18, 2011 Cara no arquivo que você usa para fazer o login Compartilhar este post Link para o post Compartilhar em outros sites