Ir para conteúdo

POWERED BY:

Arquivado

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

nknk

Sistema de login simples

Recommended Posts

Esse é um script simples de login com anti-injection, verificação de senha em md5, gostaria de sugestões, se precisa de algo para aumentar a segurança ou otimizar.

 

tabela.sql - tabela de usuários que terão acesso ao sistema, a codificação da senha deve ser em md5, por causa do arquivo verifica.php

CREATE TABLE tabela (
		id int(5) NOT NULL AUTO_INCREMENT,
		usuario varchar(20) NOT NULL DEFAULT '',
		senha char(32) NOT NULL DEFAULT '',
		PRIMARY KEY  (id)
)
INSERT INTO tabela VALUES (1, '123', '202cb962ac59075b964b07152d234b70');

login.php - página de acesso ao painel de controle

<!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>Untitled Document</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="verifica.php">
  <p>painel de controle </p>
  <p>usuario
	<input name="usuario" type="text" id="usuario" size="20" maxlength="20" />
  </p>
  <p>
	senha
	<input name="senha" type="password" id="senha" size="20" maxlength="20 />
  </p>
  <p>
	<input type="submit" name="Submit" value="Submit" />
</p>
</form>
</body>
</html>

anti.php - anti-sql injection, evitar sql injections

<?php

function anti_injection_array($array)
{
	foreach($array as $chave => $valor)
	{
		if (is_array($valor))
		{
			anti_injection_array($valor);
		}
		else
		{
			// remove palavras que contenham sintaxe sql
			 $valor = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$valor);
			 $valor = trim($valor);//limpa espaços vazio
			 $valor = strip_tags($valor);//tira tags html e php
			 $valor = addslashes($valor);//Adiciona barras invertidas a uma string
			 $return["$chave"] = $valor;
		}
	}
	return $return;
}

// Todos os dados do form limpos pra uso, nao precisa fazer um por um :)
extract(anti_injection_array($_POST));
//OU
$_POST = anti_injection_array($_POST); 

?>

verifica.php - página que verifica se existe o usuário na tabela e se a senha está correta

<?php
session_start();
require("anti.php");
require("conectabanco.php");

$usuario = $_POST['usuario'];
$senha = $_POST['senha'];

if (strlen($usuario) > 20 || strlen($senha) > 20 || strlen($usuario) < 20 || strlen($senha) < 20) { echo "Campos senha e usuário devem contém 20 caracteres no máximo "; }

else{

$sql = mysql_query("Select Count(*) as total From tabela Where usuario = '$usuario' AND senha = md5('$senha') LIMIT 1");
$total = mysql_result($sql, 0, 'total');

if ($total==1) { 

$_SESSION['usuario'] = $usuario;
$_SESSION['senha'] = $senha;

header("Location: painel.php"); }

else {echo "Dados inválidos"; }

}

?>

conectabanco.php - página de conexão com o banco de dados, deve ser sempre solicitado qdo necessitar fazer uma consulta

<?
$lugar = 'localhost';
$banco = 'banco_nome';
$usuario = 'banco_usuario';
$senha = 'senha';

@mysql_connect($lugar,$usuario,$senha);
@mysql_select_db($banco);
?>

painel.php - página de acesso ao painel - todas as páginas do painel de controle devem ter seu contéudo entre else {...}

<?php
session_start();
 if ((!$login) && (!$senha)) {
   header ("Location: index.php");
   exit;
}
else {
echo"entrou";
} ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

tabela.sql

- Dados em md5 geram strings com 32 caracteres. Esse campo com 12 é muito pequeno. Use char(32).

 

 

login.php

A senha está num input text. Coloque-a num input password.

 

 

anti.php

- Acho desnecessário retirar palavras como Where, Insert e outras. Imagine se isso ocorresse aqui no fórum. Os fóruns de BDs seriam um caos. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

- Use addslashes() somente se magic_quotes_gpc estiver em off. Use get_magic_quotes_gpc() para saber o valor dessa diretiva

- veja a função mysql_real_escape_string()

 

 

verifica.php

- Se você apenas quer saber se há registros com esses nome de usuário e senha, pode usar a função count(), do MySQL. Isso deixa o sistema mais rápido.

- Costumo selecionar a senha cadastrada no BD usando somente o nome de usuário no Where. Dessa forma, posso retornar uma mensagem avisando se somente a senha está errada ou se o nome de usuário também não existe. ;)

 

 

conectabanco.php

- Você pode usar constantes para armazenas as informações para conexão com o banco de dados. É mais lógico e seguro

- Crie uma função para conectar e só a chame quando necessário, para evitar que a conexão fique aberta quando desnecessária

- Também crie uma função para fechar a conexão após realizar todas as consultas

- Por que você chamou mysql_connect() duas vezes? :unsure:

 

 

painel.php

- Use isset() para verificar a existência das variáveis

- Use a superglobal; $_SESSION

- Onde você cria $email ou $_SESSION['email']? Pelo que vi, ela não existe.

 

 

 

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

verifica.php

- Se você apenas quer saber se há registros com esses nome de usuário e senha, pode usar a função count(), do MySQL. Isso deixa o sistema mais rápido.

Como ficaria para checar desse jeito? Eu checo o mesmo jeito que ele nos meus sites.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por exemplo:

 

$sql = mysql_query("Select Count(*) as total From tabela Where login = 'Beraldo'");
$total = mysql_result($sql, 0, 'total');

Depois é só verificar se $total é maior que zero. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Beraldo, fiz as alterações de acordo com sua sugestões e tb com o meu conhecimento e tempo. Comentando:

 

tabela.sql

- Dados em md5 geram strings com 32 caracteres. Esse campo com 12 é muito pequeno. Use char(32).

Tinha me esquecido desse detalhe.

 

login.php

A senha está num input text. Coloque-a num input password.

tb, fiz nas pressas.

 

anti.php

- Acho desnecessário retirar palavras como Where, Insert e outras. Imagine se isso ocorresse aqui no fórum. Os fóruns de BDs seriam um caos. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

- Use addslashes() somente se magic_quotes_gpc estiver em off. Use get_magic_quotes_gpc() para saber o valor dessa diretiva

- veja a função mysql_real_escape_string()

Eu entendo um pouco a função. Usei a função do Fabyo, faltou os créditos hehehe, mas o script é só pra avaliação.

 

verifica.php

- Se você apenas quer saber se há registros com esses nome de usuário e senha, pode usar a função count(), do MySQL. Isso deixa o sistema mais rápido.

- Costumo selecionar a senha cadastrada no BD usando somente o nome de usuário no Where. Dessa forma, posso retornar uma mensagem avisando se somente a senha está errada ou se o nome de usuário também não existe. ;)

Fiz essa mudança, mas depois vejo a questão de usuário errado ou senha errada.

 

conectabanco.php

- Você pode usar constantes para armazenas as informações para conexão com o banco de dados. É mais lógico e seguro

- Crie uma função para conectar e só a chame quando necessário, para evitar que a conexão fique aberta quando desnecessária

- Também crie uma função para fechar a conexão após realizar todas as consultas

- Por que você chamou mysql_connect() duas vezes? :unsure:

não tinha percebido a repetição, a respeito da função para fechar estou começando aplicar isso agora, nos meus códigos, mysql_close e mysql_free_result

 

painel.php

- Use isset() para verificar a existência das variáveis

- Use a superglobal; $_SESSION

- Onde você cria $email ou $_SESSION['email']? Pelo que vi, ela não existe.

na verdade a $email era do script original, esqueci de tirar, a maioria dos sistemas de logins trabalham sem outro campo além de usuário senha, mas em alguns casos acho necessário. vou verificar alguns scripts para tentar adaptar o meu.

 

get_magic_quotes_gpc() retornou 1, então acho q ta ligado. Eu acrescentei uma condição para verificar o tamanho dos campos casos tentem burlar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tranquilo, nknk. Qualquer coisa, pode perguntar. :)

 

Quanto a magic_quotes_gpc, se está em 1, não é necessário usar addslashes(). Você pode reduzir o IF a uma linha:

 

$txt = (get_magic_quotes_gpc()) ? $txt : addslashes($txt);

Compartilhar este post


Link para o post
Compartilhar em outros sites

nknk, você poderia postar com as alterações ? sou iniciante em php e não conseguiria arrumar isto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

nknk, você poderia postar com as alterações ? sou iniciante em php e não conseguiria arrumar isto.

 

As alterações já foram feitas no primeiro post.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou colocando no meu site este sistema de login, mas ainda nao entendi mto bem como funciona o esquema de nivel de acesso. Alguem pode me dar uma luz? oO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou colocando no meu site este sistema de login, mas ainda nao entendi mto bem como funciona o esquema de nivel de acesso. Alguem pode me dar uma luz? oO

 

Este sistema não é baseado em nível de acesso. Você teria que readaptar o código, a começar colocando um campo na tabela para nível. O restante eu não tenho conhecimento, mas você precisaria utilizar vários condições acredito.

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.