Ir para conteúdo

Arquivado

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

Thiago Moreira

[Resolvido] Sistema de login seguro

Recommended Posts

Olá pessoal,

 

to precisando de um script de sistema de login que seja bem seguro, usando criptografia e tudo mais. Precisa ser bem seguro mesmo, e que utilize session.

 

Se puderem me ajudar com um sistema seguro e q seja de fácil entendimento, agradeceria muuuuuuito.

 

 

Abração galera :D/>

Compartilhar este post


Link para o post
Compartilhar em outros sites

explique aí intaum fábio... deve ser interessante...

 

flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso mesmo posta ae se puder veio, se puder explicar tb como ficaria a parte com COOKIES pra akeles "lembrar login", na verdade tem q usar SESSION e COOKIE juntos neh ??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voce quer pronto? ou quer aprender a fazer um?

 

se quiser aprender eu posso explicar como fazer um sistema com total segurança e passo a passo

Grande Fabyo,

 

Se puder, mostre como se faz o sistema para que eu e todos possamos aprender. Eu preciso que o sistema seja muito seguro, pois ele será usado por mais de 100 empresas pequenas e grandes em todo o brasil.

 

Abração e obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

os resquisitos básicos

 

- envio de dados via POST

- manipulação de variáveis de sessão

- manipulaçao de cookies

- sql

- conexões com banco de dados mysql

- estruturas condicionais do PHP

 

vão estudando isso aí enquanto o fabyo ajuda vcs

Compartilhar este post


Link para o post
Compartilhar em outros sites

- criptografia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tava pensando em mostrar usando classes e ai envolveria outras coisas, para nao confundir muito vamos fazer do jeito mais simples, só que voce vai ver que a parte do login ficara bem seguro, porque a ideia é a mesma e voce pode aplicar ela em qualquer projeto, e como falei em mostrar passo a passo, vou começar usando um arquivo que eu uso para definir e fazer as principais verificações antes de rodar o sistema, dei o nome de init, por ser padrao em varios projetos

 

init.php:

 

<?php
//aqui eu nao deixo a pessoa acessar o arquivo diretamente
if (basename($_SERVER["PHP_SELF"]) == "init.php") {
die("Este arquivo não pode ser acessado diretamente.");
}	

// http://br.php.net/manual/pt_BR/ref.info.php#ini.magic-quotes-runtime
/*Se magic_quotes_runtime  estiver ativado, a maioria das funções que retornarem dados de qualquer fonte externa incluindo banco de dados e arquivos de texto terão as aspas escapadas com uma barra invertida. Se magic_quotes_sybase  também estiver em on, uma aspa simples é escapada com uma aspa simples ao invés de uma barra invertida.*/
if(get_magic_quotes_runtime()){
set_magic_quotes_runtime(0);
}

/*remove os efeitos das magic_quote diferente do runtime ele escapa dados vindos de formularios, GPC (Get/Post/Cookie), isso nao pode ser auterado via php.ini, por isso consertamos aqui, no PHP6 nao teremos mais magic_quotes*/
function remove_mq(&$var) {
return is_array($var) ? array_map("remove_mq", $var) : stripslashes($var);
}
//verifico se esta em on e execulto a função acima
if (get_magic_quotes_gpc()) {
$_GET	= array_map("remove_mq", $_GET);
$_POST   = array_map("remove_mq", $_POST);
$_COOKIE = array_map("remove_mq", $_COOKIE);
}
/*defino para mostrar todos os erros e desfaço o efeito do register_globals, outra parte insegura que nao existira mais no PHP6*/
if (function_exists("ini_get")) {
if(!ini_get("display_errors")){
	ini_set("display_errors", 1);
}	

if(ini_get("magic_quotes_sybase")){
	ini_set("magic_quotes_sybase", 0);
}	

if (ini_get("register_globals")) {	
	foreach($GLOBALS as $s_variable_name => $m_variable_value) {
		if (!in_array($s_variable_name, array("GLOBALS", "argv", "argc", "_FILES", "_COOKIE", "_POST", "_GET", "_SERVER", "_ENV", "_SESSION", "s_variable_name", "m_variable_value"))){
			unset($GLOBALS[$s_variable_name]);
		}
	}
	unset($GLOBALS["s_variable_name"]);
	unset($GLOBALS["m_variable_value"]);
}  
}

error_reporting(E_ALL);
//crio umas constantes para podermos usar no sistema
define("ROOT", $_SERVER["DOCUMENT_ROOT"]);
define("BASEPATH", getcwd()."/");

//pego o conteudo do include_path e ainda incluo mais paths, muito util para o sistema
set_include_path('.' . PATH_SEPARATOR . BASEPATH . 'includes'
. PATH_SEPARATOR . BASEPATH . 'classes'
. PATH_SEPARATOR . get_include_path());

// se formos usar classes elas nao precisaram ser incluidas nos scripts só estanciadas.
function __autoload($classe){
require_once $classe.".php";	
}
//adiciono o arquivo de configuração
if (file_exists(BASEPATH . "config.php")){
require_once BASEPATH . "config.php";
} else {
die("Erro: Arquivo config.php nao localizado");
}	
//http://br.php.net/manual/pt_BR/function.clearstatcache.php
clearstatcache();
?>

 

Thiago Moreira se tiver alguma duvida só postar senao seguimos em frente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu camarada,

 

pode ir prosseguindo que eu vou me 'encontrando'. Sou iniciante em PHP, por isso talvez tenha alguma dúvida, mas pode ir 'mandando bala' que eu to acompanhando :P/>

 

Obrigado por se dispor à isto. Estou realmente precisando desse sistema.

 

 

Abração

Compartilhar este post


Link para o post
Compartilhar em outros sites

config.php:

 

<?php
define("SERVIDOR", "localhost");
define("USUARIO", "usuario");
define("SENHA", "sua_senha");
define("BANCO", "sistema");
?>

 

sistema.sql:

 

CREATE TABLE usuarios (
id_usuario SMALLINT ( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,	
login VARCHAR ( 20 ) NOT NULL UNIQUE,
senha CHAR ( 32 ) NOT NULL,
email VARCHAR ( 64 ) NOT NULL,
nivel_acesso ENUM ( '0', '1', '2' ) DEFAULT '0'
) TYPE = innodb;

 

fiz um install simples caso voce tenha dificuldades de mecher com banco de dados

 

install.php:

 

<?php
if(file_exists("init.php")){
require_once "init.php";
} else {
die("Arquivo de init não encontrado");
}
//conecta no banco
$link = mysql_connect(SERVIDOR, USUARIO, SENHA);
//seleciona os banco de dados
$dbs  = mysql_fetch_array(mysql_list_dbs($link));
//aqui testa se seu banco de dados ja existe, caso nao exista sera criado
if(!in_array(BANCO, $dbs)){
$sql = file_get_contents("db/sistema.sql");
mysql_query("CREATE DATABASE sistema");
mysql_select_db(BANCO);
mysql_query($sql);	
}
?>

 

explicando sobre o sistema.sql

eu define a senha como CHAR(32) pois ela sera criptografada com MD5 entao sempre a senha tera o mesmo tamanho fixo de 32 caracteres, e o nivel_acesso podemos separar usuario comum com admin e por exemplo nivel_acesso = 0 nao tem permissao de acesso

Compartilhar este post


Link para o post
Compartilhar em outros sites

index.php

 

<?php
if(file_exists("init.php")){
require_once "init.php";
} else {
die("Arquivo de init não encontrado");
}

require_once "seguranca.php";

$dados = isset($_SESSION["dados"]) ? $_SESSION["dados"] : unserialize($_COOKIE["dados"]);
echo "Seja Bem-Vindo ". $dados["nome"]." ";
?>
<a href="sair.php">Sair</a>

 

seguranca.php:

 

<?php
session_start();
if(!isset($_COOKIE["dados"]) and !isset($_SESSION["dados"])){
header("Location: login.html");
}
?>

 

sair.php:

 

<?php
session_start();
$_SESSION["dados"] = null;
session_destroy();
setcookie("dados", "", time()-60*60*24*365);
header("Location: login.html");
?>

 

login.html:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Login</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="login.php">
 <label><strong>Nome</strong>
 <input name="nome" type="text" id="nome" />
 </label>
 <p>
<label><strong>Senha</strong>
<input name="senha" type="password" id="senha" />
</label>
 </p>
 <p>
<label for="cookie">
<input name="cookie" type="checkbox" id="cookie" value="1" />
<strong>Salvar Senha</strong></label>
 </p>
 <p>
<label>
<input type="submit" name="Submit" value="Entrar" />
</label>
 </p>
</form>
</body>
</html>

 

login.php:

<?php
session_start();			
if(file_exists("init.php")){
require_once "init.php";
} else {
die("Arquivo de init não encontrado");
}

function limpa($string){
$var = trim($string);
$var = addslashes($var);	
return $var;
}

if(getenv("REQUEST_METHOD") == "POST"){
$nome  = isset($_POST["nome"]) ? limpa($_POST["nome"]) : "";
$senha = isset($_POST["senha"]) ? limpa($_POST["senha"]) : "";

$sql = sprintf("select count(*) from usuarios where login = '%s' and senha = md5('%s')", $nome, $senha);
mysql_connect(SERVIDOR, USUARIO, SENHA) or die(mysql_error());
mysql_select_db(BANCO) or die(mysql_error());

$re = mysql_query($sql) or die(mysql_error());
if(mysql_result($re, 0)){
	$re 	   = mysql_query("select * from usuarios where login = '$nome' and senha = md5('$senha')") or die(mysql_error());		
	$resultado = mysql_fetch_array($re);

	if($resultado["nivel_acesso"] > 0){
		$dados			 = array();
		$dados["nome"]	 = $nome;
		$dados["senha"]	= $senha;			
		$_SESSION["dados"] = $dados;			

		if(isset($_POST["cookie"])){			
			setcookie("dados", serialize($dados), time()+60*60*24*365);			
		}
		header("Location: index.php");
	} else {
		header("Location: login.html");
	}		
} else {
	header("Location: login.html");
}
}
?>

 

Bom fiz da maneira mais simples possivel, para nao dificultar no seu entendimento, mas com certeza conforme voce for evoluindo da para melhorar bastante o sistema, e tbm se voce for usar mysqli ou PDO da para fazer muita coisa dahora

 

dai voce tendo a logica só fazer seu layout e colocar os codigos PHP.

 

vou deixar em anexo o sistema completo e funcionando, basta criar o banco de dados e configurar o config.php

 

dai todas as paginas que voce quer proteger com login basta incluir o arquivo 'seguranca.php'

 

agora só postar as duvidas para nos irmos esclarecendo elas

 

login.zip

Compartilhar este post


Link para o post
Compartilhar em outros sites

Graaaaaande Fabyo,

 

no meu funcionou certinho, só não funfa uma coisa: o 'lembra senha' não está lembrando. acredito que seja porque você esqueceu de mandar imprimir o Cookie nos campos.

 

Ainda sobre esse esquema de Cookies, não é pouco seguro gravar informações em cookie, especialmente quando se trata de dados para login?

 

Agradeço pelo empenho em me ajudar.

 

 

forte abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

sobre o lembrar senha esta correto sim

 

e sobre a segurança, o cookie é seguro sim, e os dados que salvei sao para simples ilustração, como por exemplo mandar um alo para o usuario

 

tem que ver se os cookies estao funcionado na sua maquina

Compartilhar este post


Link para o post
Compartilhar em outros sites

fabyo to tentando fazer um sistema de login com SESSION e COOKIE aki, peguei umas parte do teu ae...mas nao consigo fazer as SESSION e os COOKIES trabalharem juntos...tipo meu sistema eh bem simples, peguei a parte tua do "seguranca.php", "index.php", "sair.php" e umas partes do "login.php", essa parte aki q nao consigo fazer funcionar:

<?php
	$dados = isset($_SESSION['dados']) ? $_SESSION['dados'] : unserialize($_COOKIE['dados']);
	?>
	<?
	if(isset($dados['login']) && isset($_SESSION['dados'])){
	?>
	<table>
		<tr>
			<td>
			Bem vindo <?=$dados['login'];?><br />
			<a href="logout.php">SAIR</a>
			</td>
		</tr>
	</table>
	<?
	} else {
	?>
	<form action="login_db.php" method="post">
	<table>
		<tr>
			<td>Login:</td>
			<td><input type="text" name="login" size="15" /></td>
		</tr>
		<tr>
			<td>Senha:</td>
			<td><input type="text" name="senha" size="15" /></td>
		</tr>
...(aqui vai o resto do form que nao interessa agora)
<?
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Groove,

 

Não sou muito bom em PHP, mas se eu nao me engano, sempre que se vai declarar uma Session ou chamar uma Session declarada, tem que iniciar a página com session_start(). No teu script não tem isso, talvez seja por isso que você não está conseguindo fazer funcionar.

 

Aconteceu comigo, quando eu queria comparar o valor de uma Session com uma variável, não existia valor na Session. Foi só eu colocar session_start() no inicio da página que funcionou.

 

Tente isso, qq coisa mande outro post.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem session_start(); sim, soh que essa esta no topo da minha pagina por isso nao apareceu ai :D/>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Fabyo. Não sei se é ignorancia minha mas sou iniciante em php e ao fazer download do sistema veio apenas um arquivo login sem formato a principio.Mudei para php mas o arquivo parece que está todo criptografado pode me ajudar?

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Fabyo. Não sei se é ignorancia minha mas sou iniciante em php e ao fazer download do sistema veio apenas um arquivo login sem formato a principio.Mudei para php mas o arquivo parece que está todo criptografado pode me ajudar?

Obrigado

Baixe o winrar ou winzip para descompactar o arquivo, você pode encontrar estes programas no baixaki mesmo.

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.