Ir para conteúdo

POWERED BY:

Arquivado

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

Fabyo

Sistema de Login

Recommended Posts

Olá, pessoal !?Só para me iterar no assunto que ainda nao peguei para estudar (SESSAO e COOKIE), mas será o próximo assunto que vou dar enfase.O que é esses ataques sql injection e como eles ocorrem (são os cracker´s) ?<quote>Exemplo simples de um sistema login usando session e protegido contra ataques sql injection<?session_start();//função anti sql injectionfunction 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); }</quote>

Compartilhar este post


Link para o post
Compartilhar em outros sites

explicando um pouco sobre MD5

 

Existem 3 tipos básicos de algoritimos de criptografia, os

simétricos, os assimétricos e os de hash.

Os simétricos e os assimétricos utilizam uma chave de criptografia e podem ser

descriptografados.

 

O hash não podem ser descriptografados, mesmo

porque o código que ele gera não tem nada a ver com o dado original.

 

Um "hash" é um código gerado matematicamente a partir de um dado

original. Ele não é um dado codificado, mas um valor gerado a partir de

uma origem, e qualquer modificação mínima do dado original implica em um

hash totalmente diferente. Quer dizer, mesmo que você tenha um arquivo

de 1 milhao de bytes, a mudança de 1 byte no meio já implica em um hash

totalmente diferente. É dito que a probabilidade de dois arquivos

diferentes terem o mesmo hash MD5 é de 1 em

340282366920938463463374607431768211456 (1 em 2^128).

 

Vejam tambem que um hash MD5 tem um tamanho fixo de 32 bits sempre,

portanto não importa o tamanho da entrada de dados, ele sempre terá o

mesmo tamanho. E por isso é imposível reverter um hash para o valor

original, ainda mais que o codigo gerado nao guarda o dado original nele

 

O único modo de quebrar a criptografia de um hash é por força bruta...

tentando todas as possibilidades possíveis até gerar o mesmo hash.. o

que pode levar literalmente anos

Compartilhar este post


Link para o post
Compartilhar em outros sites

o meu sistema nao sai da tela de login mesmo com a senha certa... ja coloquei o campo da senha com 32 e estou gravando com md5 e lendo como md5.. o q mais pode ser?

 

 

login_pics.php

 

<form id="form1" name="form1" method="post" action="pics.php">	  <p> </p>	  <p>login:		<input name="nome" type="text" id="login" />		<br />		<br />  senha:   <input name="senha" type="password" id="login" maxlength="10" />	  </p>	  <p>	<input type="submit" name="Submit" value="logar" /></p></form> </p>

inserindo a senha com md5

 

$insere = mysql_query("INSERT INTO `cadastros` (`nome`, `senha`, `email`) VALUES ('$nome',md5('$senha'), '$email')") or die ("nao achei a tabela 'cadastros'");

o pics.php tem o include com o protecao.php.

o protecao.php ta quase igual, a diferenca eh q eu botei o ob_start(); e o nome da tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae galera não vamos deixar morrer topicos interessantes!Ate agora não vi a solução desse sistema, ele funciona perfeito, so que quando chega na pagina2, ele volta pro login! ai so por deus, tenho que fechar e abrir denovo o navegador!Se eu colocar o include protecao no topo das minhas pagina, ela ficara voltando pro login?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola estou com um problema eu entro na pagina login.html dai digito o nome e senha entao vai para pagina index.php e aparece essa mensagem:O que será???Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\Arquivos de programas\VertrigoServ\www\teste\index.php:9) in C:\Arquivos de programas\VertrigoServ\www\teste\protecao.php on line 10Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\Arquivos de programas\VertrigoServ\www\teste\index.php:9) in C:\Arquivos de programas\VertrigoServ\www\teste\protecao.php on line 10Warning: Cannot modify header information - headers already sent by (output started at C:\Arquivos de programas\VertrigoServ\www\teste\index.php:9) in C:\Arquivos de programas\VertrigoServ\www\teste\protecao.php on line 45Thiago F.B

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom esse problema do session_start() ja resolvi usando o ob_star();

mais agora o problema é o seguinte, se eu digito a senha certa dai vai pra pagina index.php beleza tudo certo até ai, mais dai quando clico no link para voltar pra pagina principal, aparece este erro:

 

Warning: Cannot modify header information - headers already sent by (output started at C:\Arquivos de programas\VertrigoServ\www\teste\principal.php:10) in C:\Arquivos de programas\VertrigoServ\www\teste\protecao.php on line 45

 

é o problema no headers

 

e esse erro acontece tambem se eu digitar a senha errada.

 

vou postar o codigo beleza

 

agrado pela ajuda

 

<?

ob_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", "root", "vertrigo");

// seleciono o banco de dados

mysql_select_db("teste");

 

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

}

 

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funciono perfeito!Apenas um porem heheheh que não poderia faltaQuando está na navegando beleza, mas quando o usuário utiliza o Voltar do Browser ele da erro, voltando para a pessoa le loga novamente.Como corrigir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando colocar uma parte de cadastro, os dados são enviados pro MySQL, tudo certinho, mas quando vou pra logar com esse cadastro, não funciona. Será que é porque a senha não vai incriptada ou nao tem nada a ver?Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando colocar uma parte de cadastro, os dados são enviados pro MySQL, tudo certinho, mas quando vou pra logar com esse cadastro, não funciona. Será que é porque a senha não vai incriptada ou nao tem nada a ver?Abraços

é sim cara, você precisa cadastra a senha com MD5alguem pra tras coloco como faze!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também estou com o problema de qualquer login e senha funciona? Alguém pode ajudar, pois já vi que tem duas pessoas tb esperando a mesma resposta!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como faria para acrescentar um popup dizendo que o login esta errado?E tem como eu colocar um link de logoff após a pessoa entrar no sistema?Se puder me ajudar.. agradeceria muito..Bjs...Deus abençoe E achei um outro problema...Se eu logar e depois voltar a pagina de login se fechar o navegador, ele não aceita mais o login...Eu tenho que fechar o navegador, entrar de novo...O que pode ser feito para resolver isso??obrigada

Compartilhar este post


Link para o post
Compartilhar em outros sites

E tem como eu colocar um link de logoff após a pessoa entrar no sistema?

O script para fazer logout eh simples. Vou posta-lo abaixo.

Vou postar um sistema que eu desenvolvi. Esta funcionando perfeito. Um pouco diferente do sistema do Fabyo, mas com a mesma finalidade.

 

conection.php (dados para conectar ao banco de dados)

----------------

<?php

 

$host = "localhost"; // IP do banco de dados

$usr = "root"; // Login do bd

$pwd = ""; // Senha do bd

$db = "accounts"; // Nome da base de dados

 

?>

conecta.php (funcoes de conexao com banco de dados)

--------------

<?php

include("conection.php");

 

$conexao = mysql_connect("$host","$usr","$pwd");

$selectdb = mysql_select_db("$db",$conexao);

 

function conectabd()

{

global $conexao, $selectdb;

if(!$conexao)

{

die('O sistema está com problemas. Tente mais tarde. ' . mysql_error());

return false;

}

else

{

if(!$selectdb)

{

die('Ocorreu um erro com o banco de dados. Por favor informe ao administrador. ' . mysql_error());

return false;

}

else

{

return true;

}

}

}

 

function fecha_conexaobd()

{

global $conexao;

mysql_close($conexao);

}

 

function checa_senha($nome,$pass)

{

global $conexao;

if (conectabd())

{

$resultado = mysql_query("SELECT login, senha FROM contas WHERE login = '$nome'", $conexao);

 

if (!$resultado)

{

die('Erro no banco de dados. Reporte ao administrador. ' . mysql_error());

}

else

{

$linha = mysql_fetch_array($resultado);

if (($linha['login'] == $nome) && ($linha['senha'] == $pass))

{

return true;

}

else

{

return false;

}

}

fecha_conexao_bd();

}

else

{

return false;

}

}

 

?>

verifica.php (garante que o usuario esta logado. Toda pagina q incluir o verifica.php sera restrita a usuarios logados no sistema)

-------------

<?php

// Inicia sessoes

session_start();

// verifica se existe sessao.

if(!isset($_SESSION["usuario"]))

{

// redireciona para pag. de login

header("Location: login.php");

exit; //garante q nao sera executado nenhum codigo dessa pagina apos o login.

}

 

?>

index.php (pagina principal)

-----------

<?php

session_start();

include("verifica.php"); //verifica se esta logado ou nao. caso nao esteja vai pra pag. de login.

?>

<html><head>

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

<div align="left"><center>

Bem Vindo <b>

<?php echo "<font color=green>".$_SESSION['usuario']."</font>"; ?></b>

<a href="sair.php">(Sair)</a></center>

</body></html>

login.php (pagina de login)

----------

<?php

 

if ($submit)

{

if ($_POST['user'] && $_POST['senha'])

{

session_start(); //carrega sessoes e destroi

session_destroy(); // para garantir que nao fique resto de outras sessoes.

session_start(); //carrega sessoes limpas.

 

include('conecta.php');

 

$login = $_POST['user'];

$senha = $_POST['senha'];

 

if (checa_senha($login,$senha))

{

$_SESSION['usuario'] = $login;

header("Location: index.php");

}

else

{

$saida = "<tr><td><div align=center><font color=red>

Senha ou Login inválidos!

</font></div></td></tr>

";

}

}

else

{

$saida = "<tr><td><div align=center><font color=red>

Preencha todos os dados.

</font></div></td></tr>

";

}

}

?>

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

<div align="left">

<form method="post" action="<?php echo $PHP_SELF ?>">

<table width="220"><tr><td>

<div align="center">

<font color="#000000">

<p align=left>Login:

<input name="user" value="<?php echo $_POST['user'];?>" type="text" size="10"><br>

Senha:

<input name="senha" type="password" size="10">

<input type="submit" name="submit" value="Enviar"></p>

</div></form></font></td></tr>

<?php echo $saida; ?>

</body></html>

sair.php (script para deslogar)

---------

<?php

 

// Inicia sessões, para assim poder destruí-las

 

session_start();

 

session_destroy();

 

header("Location: login.php");

 

?>

Ja no sistema do Fabyo, eh simples resolver esses erros.

O erro de nao passar para a "pagina2.php":

//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); // basta retirar essa linha para funcionar. Se ja existe sessao, o usuario ja esta logado, nao precisa verificar de novo.

}

Ja o problema de nao logar mais de uma vez, basta usar o script de logout que postei ai em cima. Ele nao loga mais de uma vez pq ja tem uma sessao q nao foi destruida.

 

Ai galera, espero ter ajudado.

Ate +!

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.