nknk 3 Denunciar post Postado Fevereiro 5, 2008 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
Beraldo 864 Denunciar post Postado Fevereiro 5, 2008 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
Renan Decarlo 2 Denunciar post Postado Fevereiro 5, 2008 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
Beraldo 864 Denunciar post Postado Fevereiro 5, 2008 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
nknk 3 Denunciar post Postado Fevereiro 6, 2008 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
Beraldo 864 Denunciar post Postado Fevereiro 6, 2008 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
GrayScale 0 Denunciar post Postado Fevereiro 10, 2010 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 3 Denunciar post Postado Abril 7, 2010 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
nihow 0 Denunciar post Postado Maio 21, 2010 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
nknk 3 Denunciar post Postado Maio 31, 2010 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