Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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/>
explique aí intaum fábio... deve ser interessante...
flw
beleza se puderem esperar ate amanha, é que eu to saindo do trampo, saio 17:30 e agora sao 17:20
t+ ;)/>
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 ??
>
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.
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
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);
}$_GET = array_map("remove_mq", $_GET);
$_POST = array_map("remove_mq", $_POST);
$_COOKIE = array_map("remove_mq", $_COOKIE);
} 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);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";
}die("Erro: Arquivo config.php nao localizado");
}clearstatcache();
?>
Thiago Moreira se tiver alguma duvida só postar senao seguimos em frente
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
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");
}$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
Por enquanto, beleza :D/>
vamos prosseguindo :P/>
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()); $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");
} 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
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
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
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)
<?
}
?>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.
tem session_start(); sim, soh que essa esta no topo da minha pagina por isso nao apareceu ai :D/>
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
>
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.
Eu tenho o winrar.
Estou dizendo sobre o arquivo apenas tem um login sem extensao dai eu coloco .php e quando abro fica todo criptogrado nao da pra ler nada.Tava precisando de um login pra minha página e não consegui montar aki. :wacko:/>
pessoal to aprendendo agora o php, estou com dificuldade em: onde coloco minha senha e meu login no código? qual é a senha e login desse código e ondeeu posso alterar?
Pessoal,
Esse código de login.php tem alguma vulnerabilidade:
>
<?php
// Inicia sessões
session_start();
// Conexão com o banco de bados
include("bdinc.php");
// Adicionamos uma função para verificar se o servidor executou addslashes() de forma
// transparente, senão executamos:
function checkslashes ( $valor)
{ if (
!
get_magic_quotes_gpc ())
{
return addslashes ( $valor);
} else {
return $valor;
}
}
// Recupera o nome
$nome = isset($_POST["nome"]) ? addslashes(trim($_POST["nome"])) : FALSE;
// Recupera a senha, a criptografando em MD5
$senha = isset($_POST["senha"]) ? base64_encode((trim($_POST["senha"]))) : FALSE;
// Usuário não forneceu a senha ou o nome
if(!$nome || !$senha)
{
echo "Você deve digitar sua senha e login !";
exit;
}
/**
* Executa a consulta no banco de dados.
* Caso o número de linhas retornadas seja 1 o nome é válido,
* caso 0, inválido.
*/
$SQL = "SELECT * FROM usuarios where nome = '". checkslashes($nome) ."'";
$result_id = pg_query($SQL) or die("Erro no banco de dados!");
$total = pg_num_rows($result_id);
// Caso o usuário tenha digitado um nome válido o número de linhas será 1..
if($total)
{
// Obtém os dados do usuário, para poder verificar a senha e passar os demais dados para a sessão
$dados = pg_fetch_array($result_id);
// Agora verifica a senha
if(!strcmp($senha, $dados["senha"]))
{
// TUDO OK! Agora, passa os dados para a sessão e redireciona o usuário
$_SESSION["id_usuario"] = $dados["codigo"];
$_SESSION["nome_usuario"] = $dados["nome"];
header("Location: logado.php");
exit;
}
// Senha inválida
else
{
echo "<html><body bgcolor=#E1E1E1>";
echo "<script language=JavaScript> window.alert('A senha está incorreta !'); </SCRIPT>";
echo "<script>window.location = 'index.php'</script>";
echo "</body></html>";
exit;
}
}
// nome inválido
else
{
echo "<html><body bgcolor=#E1E1E1>";
echo "<script language=JavaScript> window.alert('Usuários não encontrado !'); </SCRIPT>";
echo "<script>window.location = 'index.php'</script>";
echo "</body></html>";
exit;
}
?>
Um abraço.
Alissong
Fabyo tu é o cara!
Valeu!
Alissong...tem falha de xss (cross-site scripting) e cssf (cross-site session-forgery).
A de cssf,só "realmente funciona" se houver falha de xss,e no seu tem.
Dá uma filtrada nas tags html também cara.
Groove...tenta tirar esse trecho:
&& isset($_SESSION['dados'])
Fui!
Deveriam fixar este tópico no labóratorio muito bom!!!
Fábio parabéns mais uma vez, você é o cara!!!
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