Criando um sistema de login com PHP e MySQL

Hoje vou ensinar a criar um sistema de login simples usando PHP e MySQL.

É recomendável que você já tenha um conhecimento prévio de HTML e, se possível, PHP e MySQL para tornar as coisas mais fáceis.

Nosso sistema será bem simples: um arquivo chamado seguranca.php, que deverá ser incluído no topo do seu site (em todas as páginas) e que faz a conexão com o banco de dados e que possui algumas funções usadas para redirecionar o visitante para o formulário de login (login.php) caso ele não esteja logado.

Vamos ao trabalho:

O que iremos definir primeiro é a tabela usada para armazenar os usuários do sistema:

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,
PRIMARY KEY (`id`),
UNIQUE KEY `usuario` (`usuario`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Execute esse bloco SQL no seu banco de dados para criar a tabela usada pelo sistema.

Depois disso, vamos ao formulário de login que você colocará dentro de um arquivo chamado login.php:

<form method="post" action="valida.php">
<label>Usuário</label>
<input type="text" name="usuario" maxlength="50" />

<label>Senha</label>
<input type="password" name="senha" maxlength="50" />

<input type="submit" value="Entrar" />
</form>

Esse formulário, com apenas dois campos, manda pra página valida.php, que é um pequeno PHP que receberá os dados enviados pelo formulário, fará a validação deles e mandará o visitante ou pra página interna (index.php) ou de volta pra página de login (login.php).

Esse é o codigo fonte do arquivo valida.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($_POST['senha'])) ? $_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 estrutura do seu site, até esse ponto, deve estar dessa forma:

../pasta_do_seu_site/index.php » Página intera a ser protegida
../pasta_do_seu_site/login.php » Página com o formulário de login
../pasta_do_seu_site/valida.php » Página que faz a validação dos dados do formulário

Agora vamos criar o arquivo seguranca.php na mesma pasta dos demais arquivos:

/**
* 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']);
}

Não vou poder explicar todas as funções do arquivo pq é muita coisa.. Mas todas elas estão devidamente comentadas e documentadas… É só olhar.

Com esse arquivos nós já nos conectamos automaticamente ao servidor MySQL, então se você usar outra forma pra fazer a conexão, vá na parte de configurações do seguranca.php e defina a variável $_SG[‘conectaServidor’] pra falso (false). O mesmo acontece pra sessão com a variável $_SG[‘abreSessao’].

Agora é só incluir essas linhas no topo de cada arquivo que deverá ter o acesso restrito:

include("seguranca.php"); // Inclui o arquivo com o sistema de segurança
protegePagina(); // Chama a função que protege a página

Quando vocês quiserem exibir o nome do usuário logado, é só fazer isso:

echo "Olá, " . $_SESSION['usuarioNome'];

Veja mais sobre escrever e pegar valores da sessão (coisa que acontece muito nesse sistema de login) no tópico Aprendendo a usar sessões no PHP.

Viram como é fácil?

Pra quem quiser um tutorial mais explicado e detalhado recomendo: Como criar um Sistema de Login com Níveis de Permissão (passo-a-passo).

Nota: Alguns de vocês devem ter notado que durante essa semana, no post Criando Sistemas Seguros, falei sobre não usar nomes óbvios para tabelas de usuários. Mas esse exemplo é apenas explicativo, você pode mudar o nome da tabela de usuários se preferir e depois é só alterar a variável no bloco de configurações dentro do seguranca.php.

Veja aqui como criar um sistema de login usando classes (Orientação a Objetos) e que funciona no PHP 4 e PHP 5.

167 ideias sobre “Criando um sistema de login com PHP e MySQL

  1. Pingback: Trabalho – Links úteis |

  2. Ygor

    Cara o meu não foi de jeito nenhum, ele vai tudo certo confere tudo, mais na hora que faço o login ele não me redireciona para pagina nenhuma… por favor me ajude.

  3. essantos2013Elis

    Primeiramente Muito Obrigado, artigo muito util parabéns
    Fiz e deu certo mas não entendi onde colocar issso:

    include(“seguranca.php”); // Inclui o arquivo com o sistema de segurança
    protegePagina(); // Chama a função que protege a página

    e para que serve este código

    se puder me explicar sera muito util
    Obrigado

    1. Josué Caleb

      Em cada Página sua você deve por este codigo no topo para ele checar se o usuário está logado, caso contrário entraram sem login em certas páginas

  4. Andre Neder

    Fala Thiago,

    Sempre acompanho seus post e esse foi mais um que me salvou bastante!
    Obrigado ai pelo compartilhamento de informações, hehe

    abraços

  5. Augusto

    Tinha tudo pra ser um tutorial bem feito e completo.
    O fato de voce não ensinar como desenvolver um módulo de segurança invalida o propósito de aprender a desenvolver um sistema de login.
    Para quem quer aprender ao invéz de copiar, não serve pra nada.
    Em contra partida, foi bem feito. Mas para mim de pouca valia. Estou condicionado a usar um arquivo de sua autoria para minha ascenção profissional.
    Começar pelo fim não é a melhor maneira didática.

  6. João Mello

    Para o logout é só criar uma página sair.php e inserir a função

    <?
    include("seguranca.php"); // Inclui o arquivo com o sistema de segurança
    
    expulsaVisitante(); //Função com unset()
    ?>
    
  7. Jair

    Ei Thiago, eu tava querendo saber se tem como colocar tipo “Foto” pros cadastrados, tipo Orkut e etc…

    Meu site e um site de relacionamento !!

    Vlw.

  8. Dj panda

    ajuda ai!
    eu assiste uma vidio aula e fiz tudo certinho!
    eu fiz um sistema de php login e senha!
    agora eu to com muita duvida.
    eu posso colocar esse sistema no meu blog?
    e como eu coloco no meu blog?
    obrigado!!!

  9. Junior

    Olá quero saber algum coidigo que impessa que se cadastrem duas vezes com o mesmo e-mail.

    Parabéns pelo post ele é muito bom o problema é isso que pode se cadastrar mais de um vez com o mesmo e-mail.

    Por favor se souber o codigo mim manda por e-mail ou por aki mesmo, Araços !!!

  10. jenner

    Eu precisava que senhas diferentes conduzissem para paginas diferentes, então mudei parte do codigo da pagina valida.php para:

    if (validaUsuario($usuario, $senha) == true) {

    // O usuário e a senha digitados foram validados, manda pra página interna
    header(“Location: $usuario.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();
    }
    }

    mas ainda preciso criar cada pagina. no entanto gostaria de puxa-las do banco.

  11. Cícero Joceilton

    muito bom, eu testei e foi aprovado esse sistema, mas gostaria de um tutorial complementando este onde criassemos uma pagina onde o usuario possa alterar sua senha, isso iria me dar uma grande ajuda. a pagina do formulario teria três campos: senha atual, nova senha e confirmar senha.

  12. Rafael Marques

    Muito obrigado pela ajuda. funcionou tudo corretamente.

    Um porém. O usuário tenta acessar uma página do site e é redirecionado para a página de login certo? na hora do login ele é mandado de volta a página inicial certo?

    Se for o caso do usuário encontrar um conteúdo que o interessa mas está bloqueado para usuário, no entanto ele é redirecionado para página de login e quando loga é manda do de volta a página inicial.

    teria uma forma deste usuário ao fazer o login ser mandado para a página que ele já iria acessar antes de ser redirecionado?

    Ficarei grato em obter uma resposta. Mais uma vez parabéns pelo conteúdo.

  13. Pingback: Criando um sistema de login com PHP e MySQL | CaldeiraLivre

  14. Matheus

    Olá amigo. Parabéns pelo post, gostei e me ajudou muito. Mas só uma dúvida: Como faço para recuperar alguma variável de sessão? tipo:
    $email = $_SESSION[‘email’];

    obrigado ! ;D

  15. Anne

    Boa tarde Thiago,
    Gostaria de saber se vc pode me da uma ajuda, estou fazendo um trabalho de conclusão do meu curso, e to sem ideia de inicio, é um cadastramanento de alunos on-line. Se vc puder me dar algumas dicas agradeço muito.

  16. fabio silva

    primeiro copiei manualmente para entender e aprender..
    nao deu..
    ai dei copy cola no tuto, mesmo erro.
    arse error: parse error in C:\wamp\wwwteste\valida.php on line 7
    Nao sei que erro é esse.. eu copiei do site o codigo inteiro!

  17. Anderson

    Bom , estou me confundindo todo, sou novo em PHP, e mysql por esses dias estou vendos muitos tutoriais sobre sistema de login.Estava precisando de um sistema de login , para segurança do meu site , estou com ele quase pronto inclusive ja tenho ate pagina de cadastro, porém essa eu recebi o codigo de um amigo , alguem pode me dar algum auxilio de emplementação de um sistema de logun em cima do codigo que tenhao ? desde ja agradeço , e essse sistema de login que estava vendo e otimo … o mais explicado que vi ate agora…

  18. Matheus

    Vocês poderiam fazer um link de Logout com outros tipos de código para facilitar…:
    exemplo:
    Logout
    espero ter ajudado..
    e espero que esteja certo…xD

  19. Vicent

    Muito bom mas só funciona no meu localhost.
    quando faço o teste online tenho a seguinte mensagem:
    Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at /home/shopping/public_html/adm/logar.php:1) in /home/shopping/public_html/adm/logar.php on line 45

    o que pode ser isso?
    me ajudem alguem !! valeu

  20. Natan

    Report
    Me desculpem ai eu vacilei em uma coisa me esqueci de incluir o
    me desculpem!!!
    Mais como eu disse na postagem anterior o tutorial é otimo!!!

  21. Pingback: Servidor Offline

  22. Pedro

    Obrigado pelo tutorial, ajudou bastante…
    A minha dúvida é no caso de eu querer diferentes acessos, criei níveis para acesso e queria verificar isso na função protegePagina, é possivel?

  23. Tiago

    Caro Thiago B.,

    Registro aqui meus agradecimentos por ter me ajudado com seu tutorial.
    Depois de trancos e barrancos.. funcionou direitinho..
    Eu gostaria de quando o visitante colocasse usuario ou senha incorretos, aparecesse na mesma tela de login uma mensagem avisando que os dados não foram corretos..
    se puder me ajudar mais nessa já fico grato.
    Forte Abraço..

  24. Otávio

    Oi
    viu eu so meio novo nesses assuntos e a pergunta deve ser meio besta mais eu nao sei *.*
    por que quando abro meus arquivos php’s pelo local host eles aparecem como arquivo de texto ?
    no curso abre normal so em casa que acontece isso
    vlw

    1. A Sua WEB

      Olá Otávio.
      verifique se você tem um servidor que suporte PHP instalado e funcionando no seu computador, algo com o XAMPP, Easy PHP, LAMP, caso contrário escolha um deste e instale em sua máquina, eu gosto de utilizar o USBWebserver (funciona no Windows e é em inglês) que tem uns 10 MiB e funciona no seu pendrive.

      acho que isso lhe responde e espero ter ajudado

      []’s
      Leonir

  25. Rodrigo Aquino

    Olá Thiago, meus parabéns pelo seu conhecimento.
    sou iniciante em programação php, fazendo testes com seu sistema de login aprendi muito porem tenho uma duvida e gostaria de saber se você pode me ajudar, com esse sistema de login, implantei o wamp no meu micro e está tudo funcionando, porem qdo quero usar via rede de um outro computador, não funciona com o internet explorer, só funciona com o firefox ou chrome.

    abraços

  26. Diogo Lessa

    Olá, Thiago.
    Parábéns pelo belo trabalho.
    Gostaria de saber se é possível retornar o erro, através do PHP, quando o usuário digita o login que não existe e é redicerionado para a pág. de login novamente.
    Algo do tipo: print “Dados não batem.”;

    Abraço!

  27. Diogo Lessa

    Olá, Thiago!
    Admiro muito seu trabalho, parabéns.
    Mas gostaria de saber se é possível, através do PHP e como, retornar o erro, com o echo ou print, por exemplo, quando ocorre de um login não estar correto e, posteriormente, direcionar novamente para a página de login.
    A minha pergunta é: Ao retornar, e possível printar este erro? Mais ou menos desta maneira print “Login e senha não batem”; ou não?

    Abraço!

  28. Marcos Martins

    Olá, gostaria de parabenizar o tópico, mas tenho um problema: só me aparece os dados através do echo “Ola “.$_SESSION[‘nomeLogin’]; só na segunda pagina que é executada, vc sabe o pq?

  29. Rodrigo

    Olá Felipe, usei o seguinte código para encerrar sessão, mas n sei se funciona pq como disse no post anterior não consegui bloquear as páginas

    criei logout.php com esse código e coloquei um botão nas páginas para logout que enviava para essa, e essa retornava pro menu e dá um session destroy.
    PS. Na minha duvida anterior esqueci de mencionar q uso Google Chrome e q estou usando CSS no site.

  30. Rodrigo

    Ola thiago, vc pode me ajudar? o sistema de login tah funcionando perfeitamente, porem o código pra bloquear as páginas que n está. Coloco ele no topo das minhas pag entre e náo funciona, eu uso paginas com extensao html e php

  31. Claudio R. E. Boaventura

    Olá Thiago, tudo bem?

    Visito o blog diaramente, às vezes até mais de uma vez ao dia, e somente hoje acessei ao link “preciso de ajuda!”.
    Concordo com você, e gostaria de me desculpar de fui invasivo demais.
    Graças a Deus terminei meu TCC, só falta documentar algumas coisas. Como não estava dando certo a solução sobre a qual solicitei ajuda para você, procurei outras alternativas e resolvi o problema.
    Gostaria de agradecê-lo pela grande ajuda, e pode ter certeza que não o incomodarei mais sem detalhar melhor o problema.
    Um grande abraço, saúde e sucesso pra você!

    Claudio R. E. Boaventura

  32. filipe

    Boas! O tuturial é muito bom, inseri o campo email no banco, mas ja tentei implementar no sistema e nao consegui!
    Qual a linha que tenho de inserir pa mostrar email?
    Obrigado!

  33. Gabriel Souza

    Ola,
    Gostaria primeiramente de agradecer o tutorial que você escreveu, é realmente muito bom esse sistema.
    Porém me deparei com uma falha de segurança… se você procurar no historico pela pagina “valida.php” ela aparece no navegador a senha e login do usuario…
    Poderia me ajudar a corrigir esta falha?
    Desde já fico grato pela ajuda.

  34. Claudio R. E. Boaventura

    Olá Thiago, tudo bem? Parabéns pela sua didática em ensinar, você acabou de ganhar mais um fã. :D

    Estou precisando de ajuda com um projeto de TCC do meu curso técnico, e pelo visto você já tem bastante experiência e talvez possa me ajudar.

    O meu sistema tem telas do SARG, Nagios, Cacti e algumas opções para alteração de parâmetros do Dansguardian também.

    Telas de login não é tão complicado de fazer, porém o problema que estou tendo é criar um única tela de login e autenticar todos os sistemas ao mesmo tempo. Só como exemplo, eu digito login e senha na tela principal e automaticamente acesso as telas autenticadas do Nagios, Cacti e SARG, só para você entender melhor.

    Mais uma vez, parabéns e obrigado por compartilhar seus conhecimentos.

    Um grande abraço,

    Claudio R. E. Boaventura

  35. Pingback: Criando um sistema de login com PHP e MySQL « Rafael Cardoso

  36. Vini

    Muito bom (Parabens). Thiago, ainda não testei, mas queria antecipar uma dúvida…

    Sistema de login, existem várias formas de fazer e chegar no mesmo resultado ?

    Pq eu tenho um sistema que eu fiz que é bem diferente do que o Dreamweaver faz automatico.

    abraços

    1. Thiago Belem Autor do post

      Programação não existe certo e errado, existem 100 formas de fazer a mesma coisa e existem 100 coisas que podem ser feitas da mesma forma… No final das contas são apenas variáveis, condições e um monte de comandos.

  37. Alessandro Graciel

    Muito bom cara..mais agora como faço pra criar um logout para assim que acabar de usar o sistema??

  38. samuel

    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’])) {


    }

    a condição do “if” não está a mesma do “else if”?

  39. Marc

    Parabéns por este tutorial, está bastante completo, será que me podia enviar por email um ficheiro .zip com um exemplo dele em funcionamento?

  40. Jurandir (DK)

    Gostei muito desse post, parabéns Tiago, sou analista de sistema em PHP e lhe dou meus parabéns por você ajudar a maioria das pessoas que prescisa. Fique com Deus.

  41. Junio Cesar

    Olá!

    Bom, não sou bom com PHP mas consegui instalar direitinho…só não consegui me LOGAR.
    Alguem poderia me ajudar?

  42. Mocclass

    Olá Thiago! Gostaria de saber como colocar cada usuário em uma pasta, por exemplo:
    Crio um moderador com o nome de “Paulo” aí ao executar o comando no SQL, automaticamente cria uma pasta chamada “mod_paulo”.
    Têm como me dizer aí como fazer? Ou pelo menos como procurar isso?
    Obrigado!

  43. Abdala

    Bom dia
    Primeiramente agradeço, imensamente, a sua iniciativa. Reiniciei meus estudos sobre programação e, graças a pessoas com esta visão de compartilhar conhecimentos, que estou estimulado a me reencontrar nesta lida. Escolhi o PHP e MySql para trabalhar… Gostaria de saber qual sua opinião sobre o Joomla. Somente para esclarecimento, sou Analista de Sistemas com Pós (Lato Sensu) em Redes de computadores, fiquei muito tempo afastado devido a necessidades de atuar na minha profissão principal que é a Topografia, viajei bastante pelo Brasil.
    Saude:.Paz:.Prosperidade:.

    1. Thiago Belem

      Eu acho que o Joomla! faz um trabalho interessante como CMS (assim como o WordPress) por automatizar tudo, mas também acho que ele limita muito o site com seus módulos prontos… Acredito que o profissional deva conhecer o PHP puramente, depois aprender um framework (pois é uma programação mais avançada) e, por fim, dominar os CMSs. :)

  44. Dperesartista

    Thiago, seria importante quando você digitar os codigos para demonstração, colocar as tags do php, onde inicia e onde termina o mesmo para um melhor entendimento.
    No demais está ótimo cara, Parabéns!

  45. Dperesartista

    Seria mais interessante ainda se você disponibilizasse os arquivos dessas explicações para fazer download. tem como?

  46. Gstv Inc

    Olha tenho tentado estudar PHP ja a alguns meses percebi ser uma linguagem ate simples mas CHEIA DE MALICIA ou seja de facil acaba sendo dificil e meio confusa ,mas gostaria de PEDIR ALGO procurei por toda internet e ja li e testei varios blogs e tutoriais mas aqui vai,agente acha de tudo na net de codigo aberto blogs tipo wordprees ,CMS tipo joomla e inumeros outros tipos e utilidades mas falta um o TAL ADMIN E LOGIN PRONTO E SEGURO PARA PODERMOS USAR (por iniciantes por exemplo )nao tem eu ate tentei criar um ,uso o linux com apache e php instalados tenho varios sites aqui e temas em html e php , minha ideia e a seguinte criar uma pagina de loguin com TODAS AS SEGURANCAS NECESSARIAS e o tal admin de jeito que possa ser usado por muitos que fazem site tipo um admin que possa ser usado e modificado por todos e que viesse com dicas internas no codigo e o codigo SQL necessario para criar os usuarios …
    sei que parece estranho mas assim poderiamos desenvolver estudar e melhorar os codigos MAS PORQUE ISSO imagine toda vez que alguem vai criar um site ele vai la e recria todo o codigo de loguin TODO DE NOVO porque? bastaria ter um ja pronto e usar sempre que necessario so alterando as necessidades no admin referente ao site obrigado por tudo..

  47. Genuir

    Fiz o sistema de login passo a passo e deu certinho, mas eu fiz a consulta de senha já convertido para md5 aí fica mais seguro!

  48. Patresio

    Olá estava fazendo o sistema de login e me deparei com um erro, já fiz de tudo se puder me ajudar, diz que a sessão já foi startada e do o erro no index.php … coloquei o include certinho …

    Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent

    1. Genuir

      Deve ser algum erro de conexão no DB ou deve ser aquela maldita assinatura BOM que alguns editores adicionam no começo do arquivo .php geralmente essa assinatura fica oculto, para ver a assinatura, só debugando!!

      1. Patresio

        obrigado já consegui … agora to tentando arrumar para a senha ser sha1 … mais ele não reconhece .. como eu posso fazer isso???

  49. Anônimo

    logout q acharia legal vc por ai pra quem esta começando
    <?php
    include("seguranca.php");
    session_destroy();
    echo "

    Logout realizado com sucesso!”;
    ?>
    e gostaria tambem(se nao for pedir muito) pra você por ai um registro

  50. rodrigo

    OI Tiago,
    Muito com seu tutorial, entretanto estou tentando usar sua estrutura no WordPress.

    No index.php do WordPress tem o seguinte codigo:

    Nesse caso sou obrigado a manter o require para o arquivo wp-blog-header.php, caso contrário
    a pagina não é visualizada, esse arquivo carrega o template.

    Sabe como posso implementar isso no WordPress ?

  51. rrh

    Hoje com a cabeça fria descobri que não acontecia nada porque eu havia deletado os registros da tabela usuários. Obrigado.

  52. rrh

    Primeiramente parabéns pela iniciativa que sem dúvida nenhuma está contribuindo muito para leigos como eu no aprendizado do php+MySQL. Agora uma dúvida: Segui todos os passos e consegui proteger minhas páginas, porém não consigo logar. Quando entro com usuário e senha na página login.php não acontece nada. Pode me ajudar a encontrar o erro?

  53. Jrtorresneto

    Kara to criando um login, o usuario ta validando e enviando para a pagina do formulario, inclui as linhas seguranca.php e o protegePagina(); na pagina index.php so que qndo o header (location: index.php) manda para a pagina index.php, da erro, pois ele executa a funcao protegePagina() do seguranca.php e a sessao nao existe mais. o comando header (location : index.php) encerra a sessao???? uma linha antes desse comando o arquivo valida.php coloquei pra mostrar a sessao e mostrou. e no arquivo index.php na primeira linha coloquei pra mostrar a sessao e nao mostrou. como faço pra q a sessao fique gravada em todas as paginas??

  54. RenanCruz

    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'])) {


    }

    a condição do “if” não está a mesma do “else if”???….quando é que ele entraria no else if??

  55. Rafael Yahuki

    muito bom tutorial , creio que isso ajuda muitas pessoas no intorno do aprendizado sobre php. mais creio que o uso do OO seja mais viavel atualmente.
    seria bom para os aprendizem a dominar a orientação a objeto.
    atenciosamente : rafael Yahuki

  56. rafael

    Muito bom, muito bem explicado e organizado. Ótimo tutorial e código, me ajudou muito. Obrigado !

    Ao testar em minha máquina, não tive nenhum erro. Porém ao colocar em um servidor, recebi um erro ( “Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent” ) ao logar na parte restrita pois a session já havia sido iniciada no seguranca.php ao logar e que está sendo chamada novamente pelo include no inicio do index2.php, pelo menos foi isto que entendi. Eu deveria alterar algo no $_SG[‘abreSessao’] ? Não sei se você pode me ajudar nesta questão, de qualquer forma muito obrigado.

  57. Pedro Churro

    Olá,
    Há muito tempo que estou procurando como fazer isto,finalmente,encontrei,mas não percebo uma coisa,é so copiar esses códigos e colar no nosso Website e pronto? Ou é preciso instalar programas?

    Gostava muito de saber isso.

    Pedro Churro

  58. Jetro Bernardo

    Mestre Thiago Belém.

    Não sei o que seria de mim sem pessoas como você.
    Valeu mesmo. Salvou-me de um pepino. Precisando de algo, pronuncie-se.
    Grande abraoço.

    O legal foi esvaziar as cookies e continuar logado.

  59. JOhn

    Ola! Muito bom deu pra ter uma maior noção porem, eu criei a pagina index tudo correto só que entro nela normal e não aparece a tela de login, ja coloquei o include e tudo saberia mais o menos como me ajudar?

  60. André

    Parabéns!

    Bom me ajudou bastante, só que agora como faço pra adicionar mais campos com dados do usuário, tipo:

    email, bairro, cidade, cpf, cep, etc…

    Aguardo, obrigado!

    1. Thiago Belem

      @André
      Procure aprender um pouco mais sobre PHP e MySQL lendo tutoriais na Internet, verá que a resposta para a sua dúvida é bem simples e muito comum… É só ter um conhecimento básico de PHP + MySQL eu você consegue. :)

  61. Sitesgenesis

    Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at /home/sitesgenesis/www/valida.php:9) in /home/sitesgenesis/www/seguranca.php on line 54

    Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /home/sitesgenesis/www/valida.php:9) in /home/sitesgenesis/www/seguranca.php on line 54

    Warning: Cannot modify header information – headers already sent by (output started at /home/sitesgenesis/www/valida.php:9) in /home/sitesgenesis/www/valida.php on line 23

    erro na hora de iniciar a sessão!! por que???? pode me ajudar?

    valeu

  62. Fernando

    Cara, meus parabéns mais uma vez. Seus artigos são de muita ajuda pra mim e com certeza pra muitos!

    Parabéns. Abraços.

  63. Tiago

    teria como adaptar isso para mostrar que estão logado ? tipo um sistema de membros on-line ?

    aguardo resposta…
    se possivel enviar por e-mail agradeço

    1. Thiago Belem

      @Tiago
      Até tem… Mas seria melhor se você fizesse isso como um sistema a parte, criando uma cronjob que verifica a data da última ação dos usuários “logados” e, dependendo da quantidade de tempo, desloga ele.

  64. LUIZ HENRIQUE

    Thiago parabéns essa é minha primeira que estou comentando, mais ja te acompanho uma duas semanas, estou um problema, coloquei a o codigo de bloqueio na pagina que quero bloqueiar e aparece esta mensagem Warning: include(seguranca.php) [function.include]: failed to open stream: No such file or directory in D:xampphtdocsfamiliadecristo.comestudobiblicoindex.php on line 2

    Warning: include() [function.include]: Failed opening ‘seguranca.php’ for inclusion (include_path=’.;D:xamppphppear’) in D:xampphtdocsfamiliadecristo.comestudobiblicoindex.php on line 2

    Fatal error: Call to undefined function protegePagina() in D:xampphtdocsfamiliadecristo.comestudobiblicoindex.php on line 3

    você pode me dizer o que pode ser? obrigado que Deus continua te iluminando mais você com mais sabedorias

  65. ROBERTO

    Olá,

    Acredito que nao seja mais esse o problema. Transcrevi seu banco pelo phpAdmin, entao agora usei mysql.^^

    Só que agora, quando o formulario redireciona pra valida.php, não acontece nada, a página fica em branco, sem nenhuma mensagem.

    Eu gostaria que vc me dissesse o que pode estar acontecendo.

    Desde ja muito obrigado.

  66. ROBERTO

    Eu estou começando a mexer com conexões agora, e me surgiu uma dúvida…

    Eu posso usar o Sql Server (2008, no caso) pra fazer banco mySql?
    Eu uso o Easy php como servidor.
    O banco que vc colocou aqui ta dando um monte de erros na tabela… Como eu faço isso?

  67. Denise

    Ola Thiago! Parabens pelo tutorial! mt bom msm =)

    Entendi quase td, so me restou uma duvida…

    Eh dito que devemos incluir no inicio de cada pagina as linhas
    include “seguranca.php”
    protegePagina();

    Pelo que li em alguns tutoriais, a funcao ‘include()’ executa como que se dessemos ctrl-C ctrl-V de todo o texto do arquivo chamado para o arquivo que o chama.

    Neste caso, se incluimos seguranca.php em todas as paginas estamos setando a variavel $_SG[‘abreSessao’] sempre para true, ou seja, estaremos sempre abrindo uma nova sessao.

    Isso nao faz com que apaguemos as variaveis de sessao salvas anteriormente?

    Grata.

  68. Everton

    Cara! parabéns tuto muito bem feito e bem explicado!
    Tava aqui tentando reinventar a roda quando achei seu tutorial..
    Só tenho a agradecer funcionou 100%

    abraço!

  69. andre mattos

    Voce está de parabéns, muito bem elaborado o seu script e funciona que é uma beleza, muito bom mesmo, mais tem uma coisa que está me incomodando que é o fato da senha não estar criptografada no banco de dados pode ser mesmo com md5 mesmo, pode me informar aonde posso coloca-la em seu script ou ainda poderia criar ou enviar um formulário de cadastro para este post, muito obrigado pela atenção meu amigo, sucesso…

  70. Jordana

    Bem, eu fiz o logout da seguinte maneira:
    fiz um link na pagina para a pagina logout.php onde esta o codigo:

    <?
    session_start();
    session_destroy();
    session_unset();
    echo "alert(‘Logout realizado com sucesso’);top.location.href=’login.php';”;
    ?>

    deu certo, espero q esteja certo tb!!

    espero tb q seja util.

    []’s

  71. Jordana

    excelente dica, Thiago.

    a partir desse sistema, como vc faria o logout?
    gostaria de criar um link “logout” onde o usuario clicaria e fecharia a sessão.

    abraços

  72. Rodrigo

    Estou utilizando este sistema de login, ótimo trabalho Thiago!

    Quanto ao logout, tb tive duvidas quanto a isso e pesquisando descobri esta maneira, crio um arquivo logout.php com isso:

    session_start(); //iniciamos a sessão que foi aberta
    session_destroy(); //destruimos a sessão
    session_unset(); //limpamos as variaveis globais das sessões
    Header(“Location: login.php”);

    depois é só chamar o arquivo logout.php para desconectar, minha duvida é, tudo bem quanto a fazer o logout desta maneira?
    aparentemente esta tudo ok, o logout parece funcionar perfeitamente.

    Abs, e ótimo trabalho

  73. Carl Carson

    Blz
    Thiago
    Excelentes post’s assim que posso tenho lido todos, percebi que neste o pessoal tem muitas duvidas de como fazer o logout da session que vc criou no arquivo segurança.php, não seria interessante você colocar o script para efetuar o logout deixando a aplicação e a materia completa.

    Valeu

    Grande abraço.

  74. udson

    Muito bom! funcionou certinho, mas tenho uma pergunta. Como faço para desloagar tem alguma função para fechar a sessão?

  75. Rafael Costa

    Salve Thiago! Muito obrigado por dinsponibilizar este sitema tão bém explicado. A unica duvida que eu tenho é sobre a variavel $_SG, ela é uma função/variavel padrão do PHP ou é definição sua mesmo. como ela funciona? Ainda estou aprendendo a usar variáveis globais.
    Agradecido

  76. AndreM

    include(“seguranca.php”); // Inclui o arquivo com o sistema de segurança
    protegePagina(); // Chama a função que protege a página

    Isto não está funcionando!, está dando para acessar o painel sem estar logado :

    Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at C:AppServwwwAdminawards_add.php:1) in C:AppServwwwAdminseguranca.php on line 46

    e no meu está dando este erro, espero a resposta!

  77. Carlos

    Rapaz, vi que há uma variável validarsempre mas não consegui fazer funcionar. Resolvi o problema alterando a ordem de pesquisa das paginas iniciais no apache. Ficou assim:

    DirectoryIndex default.php index.php index.html index.htm index.php3

    Coloquei o código de validação em default.php.

    Resolvido meio no bacalhau mas beleza

    Paz e bem!

  78. Carlos

    Fala Thiago!
    Muito bom o tutorial. Cara, implementei o login mas o site que estou desenvolvendo é em joomla. Acontece que ele pede a senha em todas as paginas… Obviamente, já que tudo no joomla é aberto na index.php. Gostaria de saber se seria possível escrever um if para ver se o usuario já esta conectado e, estando, nao pedir o login. O que acha? Ps. Não sei nada de php mas sou programador há 20 anos. Na semana passada tambem não sabia nada de joomla… Um abraço e parabéns!

  79. Renan

    Thiago, está ótimo o seu sistema de login, mais eu estou tendo um problema, ele aparece este erro na página de login: Fatal error: Cannot redeclare validausuario() (previously declared in C:xampphtdocscollateralgamescmsconfig.php:73) in C:xampphtdocscollateralgamescmsconfig.php on line 108. (Em vez de segurança.php eu coloquei cmsconfig.php) Este erro está aparecendo na página de login, que é a que contém o código da valida.php, pode me dizer o que é?

  80. Marcela

    Eu coloquei o seu código no meu site pra o login e senha, mas toda vez que eu vou acessar aparece :
    Fatal error: Call to undefined function mysql_connect() in C:xampphtdocsSiscome-siteseguranca.php on line 55

    O q eu faço?

  81. Claudio

    Thiago, quando “embuto” o php numa página html, mesmo salvando-a como php, dá aquele erro, apesar de o “valida.php” estar ok (sem espaços). O que fazer ? Pode ser erro no servidor ?
    Grato desde já.

  82. Celso Gomes Vieira

    Parabens pelo post. Execelente dica.
    Utilizei no site que eu estou desenvolvendo e necessitava de uma intranet.

    Seu site sera um dos meus pontos de apoio a partir de agora!

    obrigado

  83. Claudio

    Thiago, tudo bem ?
    Estou aprendendo php e e apanhando…
    Publiquei o sistema e está dando os seguintes erros:
    Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at /home/copiador/public_html/valida.php:2) in /home/copiador/public_html/seguranca.php on line 35

    Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /home/copiador/public_html/valida.php:2) in /home/copiador/public_html/seguranca.php on line 35

    Warning: Cannot modify header information – headers already sent by (output started at /home/copiador/public_html/valida.php:2) in /home/copiador/public_html/valida.php on line 16

    O que posso fazer pra consertar ?

    Desde já, grato pela atenção.

  84. kaue

    Ola, parabens pelo blog thiago

    esse tutorial é para os usuarios acessarem o mesmo conteudo certo

    gostaria de ver como funcionaria com sei la…3 tipos de planos…conteudos diferentes…onde o usuario so podera acessar certos arquivos de acordo com seu plano

    1. Thiago Belem

      @gsguma
      Na maioria dos sistemas o logout acontece quando ficamos X minutos inativos… Mas você pode fazer o cURL acessar a url de logout e você fez o logout. ;)

  85. Miguel

    Olá thiago, como vai? sou iniciante em PHP e estava procurando orientações na net para pode fazer meu projeto final (PHP + mysql) e achei interessante seu site e gostaria de algumas dicas sua para poder iniciar o projeto corretamente! Por favor, se for possível mande-me um email com algumas dicas…..

  86. Leandro

    Olá Thiago…

    Acompanho seu blog diariamente … muito conteudo bom….

    gostaria de lhe pedir se tens como fazer um login com php e mysql com

    limite de tentativas pra ter um exemplo de como fazer isso…

    desde ja agradeço…

  87. RICARDO KRUGER

    GOSTEI MUITO DESTE SISTEMA DE LOGIN, JÁ TESTEI E ESTÁ FUNCIONANDO PERFEITAMENTE BEM. ESTOU CRIANDO PÁGINAS PARA USUÁRIO EM MEU SITE E ESTAVA PRECISANDO ENTENDER O SISTEMA DE LOGIN, POIS O DE CADASTRO JÁ ESTÁ PRONTO E FUNCIONANDO.

    abraços

  88. Geraldo

    Obrigado pela resposta… O cliente quer q o site dele seja acessado so por lojistas..por isso pediu login e senha…Qto aos exemplos é so copiar e colar la no dream? eu ja estou acostumado e domino ele..rs..Eu preciso ter php instalado aqui no meu micro e sql tb? isso q n sei..e como fari apra testar se esta funcionando sem estar hospedado.
    Obrig novamente
    PS: É que n sei nada mesmo de php..ja li muito e n entendi ainda…rs danado

    1. Thiago Belem

      @Geraldo
      Recomendo que você estude mais sobre PHP antes (sem MySQL ainda), depois aprenda um pouco sobre PHP + MySQL.. Esse tutorial não é para usuários avançados mas também não vai ser compreendido por que não entende nada… É preciso já ter uma base antes de conseguir usar/fazer um sistema de login.

      Abraços! :)

  89. Geraldo

    Nao domino nada de php…ta difiicl, e de todos os codigos que vi este foi o mais esclarecido..mai slimpo..dissecado..mas mesmo assim to perdido e preciso fazer um site que exige login e senha(ja fiz um monte , este é o primeiro que me pedem com isso) domino muito bem html, css, mas de php…nada. É so copiar e ta tudo blz? o que preciso ter no meu micro alem do dream? Obrigado..

    1. Thiago Belem

      @Geraldo
      Fala Geraldo… Obrigado pelos elogios! Bom… Eu costumo recomendar o não uso do Dreamweaver por que ele cria um código muito sujo… Procure editores onde você trabalha diretamente com o código por exemplo o Notepad++ ou o NetBeans… Sobre o tutorial, ele foi um exemplo… copiando ele deve funcionar, mas óbviamente você vai precisar ajustar as suas necessidades. :)

  90. Anderson Henrique Bento

    Este tuto ficou mto bom cara!!! parabéns….
    Assim como me ajudou mto acredito que ajudará mtas pessoas que estão começando com php..

    Continue com esta inciativa sempre!!

    Parabéns!!!

  91. Rodrigo Berriel

    Ótimo, tudo muito bem explicado…

    Eu só gostaria de saber como faço para saber se alguém tentou fazer login no sistema e deu errado…

    Agradeço pela paciência =]

    Abraços!

  92. Otto

    Bom thiago, sou iniciante em programação PHP e estou montando uma WEB em LAMP e este tutorial me ajudou muito para criação como na segurança. Muito show seu artigo…..

Os comentários estão fechados.