Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, estou montando um sistema de gerenciamento de conteudo para um site e gostaria de saber sobre a segurança de login em php salvando sessions.
podem avaliarem e darem suas sugestoes? agradeceria muito!
login.php
<FORM action="autenticacao.php" method="post">
<p class="form-text">LOGIN DE USUÁRIO</p>
<INPUT name='usuario' class="form-login" size=20 maxlength="30" required autofocus />
<p class="form-text">SENHA DE USUÁRIO</p>
<INPUT type='password' size=20 name='senha' class="form-pass" required />
<input type='hidden' name="enviado" value="posted">
<input type=submit id="botao" value="" class="submit" name=Submit>
</FORM>
autenticacao.php
<?php
ob_start();
session_start();
include ("conexao.php");
$cliente_username = mysql_real_escape_string(trim(strip_tags(addslashes($_POST['usuario']))));
$cliente_password = mysql_real_escape_string(trim(strip_tags(addslashes($_POST['senha']))));
$enviado = $_POST["enviado"];
if ($enviado == "posted"){
if (!isset($cliente_username) or !isset($cliente_password)) { echo "Erro!"; exit; }
if (empty($cliente_username) or empty($cliente_password)) {
echo "<script>";
echo "alert('Login ou Senha incorretos!');";
echo "window.location.href='login.php'";
echo "</script>";
exit; }
$query = "select * from usuarios where login = '$cliente_username' and senha = '$cliente_password'";
$result = mysql_query($query);
$number = mysql_num_rows($result);
if ($number==0) { ?>
<script>document.location = 'login.php'</script>
<?php
exit;
} else {
$_SESSION['usuario_id'] = mysql_result($result,0,'id');
$_SESSION['usuario_nome'] = mysql_result($result,0,'nome');
$_SESSION['nivel'] = mysql_result($result,0,'nivel');
$_SESSION['email'] = mysql_result($result,0,'email');
?>
<script>document.location = 'painel.php'</script>
<?php
}
mysql_close($conexao);
}
?>
conexao.php
$database="localhost"; // SERVIDOR
$dbname="database"; // SEU BANCO DE DADOS
$usuario="usuario"; // USUÁRIO DO MYSQL
$dbsenha="senha"; // SENHA DO MYSQL
$conexao = mysql_connect ($database, $usuario, $dbsenha);
if($conexao){
if (mysql_select_db($dbname, $conexao)){ print "";
}else{ print "Não foi possível selecionar o Banco de Dados"; }
}else{ print "Erro ao conectar o MySQL"; }
?>
quando logado, faço include nas paginas restritas do arquivo "verifica.php"..
verifica.php
<?php ob_start(); ?>
<?php
if (!$_SESSION) session_start();
if (empty($_SESSION['usuario_id'])) {
echo "<script>";
echo "alert('Acesso não permitido!');";
echo "window.location.href='../login.php'";
echo "</script>";
exit;
}else{
include('conexao.php');
$sessao_id = $_SESSION['usuario_id'];
$sessao_nome = $_SESSION['usuario_nome'];
$sessao_nivel = $_SESSION['nivel'];
$sessao_email = $_SESSION['email'];
// PEGA OS DADOS DO USUÁRIO
$query = "SELECT * FROM usuarios where id = ".$sessao_id;
$resultado = mysql_query($query);
$campo = mysql_fetch_array ($resultado);
$usuario_id = $campo['id'];
$usuario_nome = $campo['nome'];
$usuario_nivel = $campo['nivel'];
$usuario_email = $campo['email'];
}
?>
Bom é isso aí..
existe alguma vulnerabilidade?
o que dá pra melhorar?
conto com a ajuda de vocês! Obrigado...
voce diz criptografar? md5?
uma vez eu tentei mas o sistema tem um "esqueci a senha" e ai a senha é enviada para o email da pessoa, ai com o md5 eu nao consegui fazer isso, é possivel? rs
valeu pela resposta, vou pesquisar sobre isso!
tem algo mais? implementando apenas md5 ja fica seguro?
>
voce diz criptografar? md5?
criptografia é uma coisa. hash é outra.
em suma, criptografia tem volta. hash, não. md5 é um hash.
leia mais sobre isso, pois é importante
>
uma vez eu tentei mas o sistema tem um "esqueci a senha" e ai a senha é enviada para o email da pessoa, ai com o md5 eu nao consegui fazer isso, é possivel? rs
Experimente clicar em 'esqueci minha senha' aqui no fórum (isso vale pra muitos outros. o wordpress, por exemplo). Ele não manda a sua senha. Ele manda um link único para você criar outra senha. Outra possibilidade é gerar uma senha aleatória, enviar pro usuário e pedir pra ele trocar o mais rápido possível.
Fato é que você não pode salvar a senha em texto plano. A senha não lhe interessa em nada, só lhe interessa autenticar o usuário.
Veja os casos de vazamento do LinkedIn, do Yahoo... imagine se essas senhas não tivessem nem um hash nem nada :)
>
tem algo mais? implementando apenas md5 ja fica seguro?
use um "salt". leia o link que lhe indiquei, que entenderá melhor.
e há outras opções de hash mais seguros, como sha1, sha612 etc
Beraldo, obrigado pela ajuda até agora.. resolvi utilizar md5 e parece que está tudo funcionando dentro dos conformes..
segue minha autenticação modificada:
<?php
ob_start();
session_start();
include ("conexao.php");
// função anti sql injection
function anti_injection($sql)
{
// remove palavras que contenham sintaxe sql
$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql);
$sql = mysql_real_escape_string($sql);return $sql;
}
// pega os campos do formulario de login
$user = anti_injection($_POST['usuario']);
$pass = md5(anti_injection($_POST['senha']));
$enviado = $_POST["enviado"];
if ($enviado == "posted"){
// verifica existência dos campos...
if (!isset($user) or !isset($pass)) {
echo "<script>";
echo "alert('Login ou Senha incorretos!');";
echo "window.location.href='../'";
echo "</script>";
exit;
}
// verifica se campos estão vazios... echo "<script>";
echo "alert('Login ou Senha incorretos!');";
echo "window.location.href='../'";
echo "</script>";
exit;
}
// busca usuario no banco
$query = "select * from tbl_usuarios where login = '$user' and senha = '$pass'";
$result = mysql_query($query);
// contagem se usuario existe
$contagem = mysql_num_rows($result);
// se contagem for igual à 0
if ($contagem == 0) {
// ir para página de erro ?>
<script>document.location = '../erro.php'</script>
<?php
exit;
}$_SESSION['usuario_id'] = mysql_result($result,0,'id');
$_SESSION['usuario_nome'] = mysql_result($result,0,'nome');
$_SESSION['nivel'] = mysql_result($result,0,'nivel');
$_SESSION['email'] = mysql_result($result,0,'email');
//redireciona para pagina restrita
?><script>document.location = '../painel.php'</script><?php
}
mysql_close($conexao);
}
?>
isso já mantem o sistema mais seguro correto? mas ainda há vulnerabilidade? o que seria bom fazer a mais?
Quanto ao salt number, não consegui me virar sozinho com os exemplos do artigo.. se for MELHOR e simples de implementar ao meu codigo, aceito qualquer ajuda.. hehe
ate mais
esta linha é desnecessária:
$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql);
você tem que proteger o sistema, mas sem danificar os dados. Imagine se este fórum retirasse essas strings? O fórum de SQL não serviria para nada
E sobre o addslashes(), use apenas quando magic_quotes_gpc estiver inativo.
Veja o exemplo do manual do php:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST['lastname']);
} else {
$lastname = $_POST['lastname'];
}
entendi..
então no caso dessa função... eu poderia utilizar dessa forma?
function anti_injection($sql)
{
// remove palavras que contenham sintaxe sql
$sql = mysql_real_escape_string($sql);
$sql = trim($sql);//limpa espaços vazio
$sql = strip_tags($sql);//tira tags html e php
if (!get_magic_quotes_gpc()) {
$sql = addslashes($sql); //Adiciona barras invertidas a uma string
}
return $sql;
}assim é suficiente, sim. Aliás, pode ser até demais em alguns casos, pois retira até tags html, que às vezes você pode permitir
recomendo ler esta discussão :thumbsup:
você salva a senha no bd em texto plano? isso é terrível! :o
use algum tipo de hash
veja
http://rberaldo.com.br/seguranca-em-sistemas-de-login-senhas-e-cookies/