Ir para conteúdo

Arquivado

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

Fabyo

Sistema de Login

Recommended Posts

Exemplo simples de um sistema login usando session e protegido contra ataques sql injection

 

nivel iniciante

 

mas basicamente você precisa só colocar nas suas paginas o include "protecao.php"

 

index.php:

 

<?php
include "protecao.php";
?>

 

login.html:

 

<html>
<head>
<title>Sistema de Login</title>
</head>

<body>
<h1>Sistema de Login</h1>
<form action= "index.php" method="post" name="login" id="login"></a> 
<label for="nome">Nome:</label>

<input type="text" name="nome" id="nome" />

<label for="senha">Senha:</label>

<input type="password" name="senha" id="senha" />
<input type="submit" name="submit" value="Entrar" style="cursor: pointer;" /> 
</form>
</body>
</html>

protecao.php:

 

<?php
session_start();

//função anti sql injection
function anti_injection($txt)
{
//Verifico se esta ativado magic_quotes caso esteja desativado uso a função addslashes
$txt = get_magic_quotes_gpc() == 0 ? addslashes($txt) : $txt;
//referencia:
//http://www.php.net/get_magic_quotes_gpc
//http://www.php.net/addslashes

// retiro da variavel esses caracteres (--, #, *, ;) 
return preg_replace("@(--|#|*|;|=)@s", "", $txt); 
}

function verifica_usuario($nome, $senha)
{
//conecto ao servidor de banco de dados passo o nome do servidor usuario e senha
mysql_connect("localhost", "usuario", "senha");
// seleciono o banco de dados
mysql_select_db("login");

/*faço uma pesquisa perguntando a quantidade de usuarios com o nome e a senha passada pelo usuario usando o count ele conta a quantidade de ocorrencias no select essa maneira é a forma mais rapida e correta desse tipo de pesquisa, muitas pessoas usam o select * from e pega com mysql_num_rows() dessa forma prejudica muito mais o acesso ao banco podendo travar se tiver muitos acessos simutaneos*/

$re = mysql_query("select count(*) as total from usuarios where nome = '$nome' and senha = 
md5('$senha')");

//referencia: http://www.php.net/md5 e http://www.php.net/mysql_result
$total = mysql_result($re, 0, "total");
mysql_close();

/* se o total for diferente de 1 é porque o usuario nao esta cadastrado usando dessa forma o resultado esperado sempre sera 1 porque você precisa tbm criar um sistema de cadastros que deixe apenas um usuario ser cadastrado evitando usuarios repetidos */
if($total != 1)
{
// redireciono para pagina de login
header("Location: login.html");
exit;
} 
// se nao existir ja a sessao eu gravo ela
if(!isset($_SESSION["dados"]))
{
$dados["nome"] = $nome;
$dados["senha"] = $senha;
//gravo a sessao por padrao o php hj ja passa o serialize automaticamente nao precisa mais passar ela
$_SESSION["dados"] = serialize($dados);
} 
} 

//verifico se existe a sessao e ja pego os dados que nela contem
if(isset($_SESSION["dados"]))
{
$dados = unserialize($_SESSION["dados"]);
$nome = $dados["nome"];
$senha = $dados["senha"];
verifica_usuario($nome, $senha);
}
else
{
//aqui eu verifico se o usuario esta vindo de um formulario e pego os valores
$nome = isset($_POST["nome"]) ? anti_injection($_POST["nome"]) : "";
$senha = isset($_POST["senha"]) ? anti_injection($_POST["senha"]) : "";
verifica_usuario($nome, $senha);
}

?>
</body>
</html>

principal.php:

<?php
// incluo a pagina de protecao que faz a verificação do usuario
include "protecao.php";
?>

pagina2.php:

 

<?php
include "protecao.php";
?>

 

 

 

banco de dados usado no exemplo:

 

ja tem o usuario Teste senha 123

obs: lembre-se na hora de gravar mais um usuario usar md5 na senha

 

CREATE TABLE usuarios (
id_usuario smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
nome varchar(40) NOT NULL DEFAULT '',
senha varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (id_usuario)
)
INSERT INTO usuarios VALUES >(1, 'Teste', '202cb962ac59075b964b07152d234b70');

 

 

pessoal esta muito simples e funcional, mas se tiverem duvidas postem ai que eu respondo

Compartilhar este post


Link para o post
Compartilhar em outros sites

http://forum.imasters.com.br/public/style_emoticons/default/cry.gif

 

 

Fabyo, estou tentando usar seu sistema de login e ocorreu os seguintes erros.

 

Primeiro:

Ocorre quando eu erro a senha na linha 25 que é o comando ( header("Location: teste.htm") ;)

 

Warning: Cannot modify header information - headers already sent by (output started at c:\windows\serv-n\www\paginas\senha\protecao.php:9) in c:\windows\serv-n\www\paginas\senha\protecao.php on line 25

 

Substitui pelo comando (include "login.html" ;) Não sei se é a mesma coisa, mas funcionou.

 

Segundo:

Bom funcionando com o comando (include "login.html" ;) , quando eu vou para a pagina2, volta para o login, e eu não consigo de forma alguam logar novamente.

 

Terceiro:

Inclui uma pagina3, porem como eu disse anteriormente, quando eu estou na pagina principal e tento ir para pagina2 eu volto para o login.

 

Você poderia ver o que acontece?

Compartilhar este post


Link para o post
Compartilhar em outros sites

esse erro é porque nao pode ter nenhuma saida html antes do header se tiver use ob_start() no inicio da pagina e deixa o header

 

o include inclue é bem diferente de um header

 

www.php.net/header

 

www.php.net/include

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou usando esse esquema,ocorre que vou pra pra pagina Principal.php ou outras no meu caso como festa.php, noticias.php estou sempre chamando o protecao.php no inicio de cada pagina, porém tem uma hora que ele se perde, não entendo o porque, eu dou echo $login= $_POST['$login']; echo $senha= $_POST['$senha'];e ele reclama dizendo que não está vindo nada na variável.Gostaria se saber se eu tenho que passar mais algum parametro no protecao.php ou nas outras páginas, pra estar recebendo e passando esses dados a partir do momento que passou pela protecao.php Obrigado,Robson Veneruchirveneruchi@hotmail.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyo,eu utilizei o comando echo; para mostrar o conteúdo das variáveis, estive debugando minhas paginas e quando eu comentei o trecho, funcionou.else{$nome = isset($_POST["nome"]) ? anti_injection($_POST["nome"]) : "";$senha = isset($_POST["senha"]) ? anti_injection($_POST["senha"]) : "";verifica_usuario($nome, $senha);}agora não consigo identificar aonde está exatamente o erro pois volta pra página de login.Valeu pela força,Robson Veneruchi

Compartilhar este post


Link para o post
Compartilhar em outros sites

No ''proteção.php'' deve inserir o código citado, no caso seria o que contém o código de proteção anti SQL injection.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyo, eu já tenho um sistema de login, mas preciso usar session nele e adicionar o script de sql anti_injection, teria como você comentar seu código para eu ver o que preciso e utilizar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

To com um probleminha heheEle nao entra no login, eu coloco o login teste e a senha 123 e ele volta a tela de login, provavelmente porque nao autenticou a senha.. mas eu já adicionei o usuario com id=1 nome=teste senha=123você sabe uq pode estar errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

você tem que usar um campo para senha com tamanho de 32e gravar a senha com md5 porque no select ele ta buscando uma senha com md5

Certinho, valeu mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá fabio, sou eu aqui denovo te enchendo o saco hahaÉ que eu estou precisando fazer níveis com o meu sistema de logins. Sendo assim gostaria que você me disesse onde posso fazer a verificação para saber que nivel o usuario é.Porque como esse sistema de login é com include nas paginas, eu teria que verificar no proteção em que nivel este usuario está. Mas nao sei como, pode me dar uma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

crie uma tabela de grupos por exemplo admin, usuario, etc...

 

e na tabela usuarios coloca um fk_grupo pra relacionar com essa tabela grupos dai só fazer o select e pegar de qual grupo o usuario faz parte

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.