• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Llaverola

Fazer um login

16 mensagens neste tópico

pessoal, criei um base de dados em mysql ,e agora tenho d criar uma pagina web para essa BD. só q tenho d fazer um login, e isso n sei fazer :S

alguem me explica como fazer? obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ESTE É O MEU FICHEIRO login.php

<html>
<head>
</head>
<body>
<?


// as seguintes variaveis vao receber os valores, respectivos,  que foram escritos no from  da seguinte forma
$nome=$_POST["$ricardo"];
$password=$_POST["$coelhor"];


// vamos connectar ao servidor:  localhost ( pode ter outro endereço ) , utilizador :  nome_do_utlizador , e password :"pass "
$conectar=mysql_connect("localhost", "13137","jokjHp" ) or die ("Falhou ligar a base de dados...");


// vamos seleccionar a base de dados que queremos, neste caso "tofas"
$bdd=mysql_select_db("projecto", $conectar) or die ("Falhou..base de dados desconhecida....");

// a pesquiza pretendida 
$pesquisa="select user_password from tbl_auth_user where user_id='$ricardo';";

//efectuar a pesquisa na base de dados : projecto
$resultado=mysql_query($pesquisa);

// aqui vamos obter o numero de resutados obtidos (   linhas ... )
$num=mysql_num_rows($resultado);


// se tivermos obtido resultados vamos fazer a verificao da pass, e efectuar as operacoes que pretendemos

if( $num!=0 )
{   // enquanto exiterem linhas ( nao esta mto correcto mas espero que tenham percebido a intencao) 
while( list($password)= @ mysql_fetch_row($resultado) )
{  
   // a variavel query vai tomar o valor da pass que foi resultado da pesquisa
   $query=$password;
}

    // vamos verificar se as pass's sao iguais para poder continuar 
if( $query==$password)
{ // aqui as pass's sao iguais 

     echo "<br>consegui efectuar o login..." ;

}
else // aqui as pass's sao  diferentes
{
    echo "<br> password errada ou entao o numero de utilizador";

}

}
else  // aqui temos que $num=0
{
  echo "<br> houve um erro, nao foi possivel efectuar o login, numero de utilizador invalido...";

}

// desligar a ligacao a base de dados... 
mysql_close($conectar);


?>

</body>
</html>


e este é o meu ficheiro enviar.html que contém tb codigo .php

<html>
<head>
<title> Login </title>
</head>

<body>

<p><b> Login </b></p>

<form action="login.php" method="POST">

<!--      texto referente ao titulo  da caixinha e  respetiva caixinha para o utilizador escrever o nome ou pode ser o numero de utilizador, é so alterar ....   
o valor que vai ser escrito vai ser o valor da "variavel nome" (  pode mudar a palavra nome para outro nome...  ) 
o valor de size pode tambem ser alterado....( que deve corresponder ao tamanho que é definido na base de dados ) 
-->

<b>Numero do utilizador</b> 
<p><input type="text" value="" name="nome"size="10" ></p>

<!--      texto referente ao titulo da caixinha  e respetiva caixinha para o utilizador escrever a password ....        
o valor que vai ser escrito vai ser o valor da "variavel pass" (  pode mudar a palavra pass para outro nome...  ) 
o valor de size pode tambem ser alterado....( que deve corresponder ao tamanho que é definido na base de dados ) 

-->
<b><br>Password</b>
<p><input type="password" value="" name="pass" size="20" ></p>

<p> <!--  botoes         submit ->  Login  ( pode mudar este nome)  e   reset-> Reset  ( pode mudar este nome)       -->
   <input type="submit" value="Login" name="validar" >
     
   <input type="reset" value="Reset" name="limpar" >
</p> 

</form


</body>
</html>

VERIFICAM ALGUM ERRO????

é q n tou a conseguir fazer o login. esses ficheiros estao na pasta do xampp/htdocs...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta abrir o php com <?php e fechar com ?> em vez de <? e ?>.

$nome=$_POST["$ricardo"];
$password=$_POST["$coelhor"];

Isto está incorrecto. Tens de por o nome dos campos do HTML, ou seja nome e pass, ficará

$nome=$_POST["nome"];
$password=$_POST["pass"];


$pesquisa="select user_password from tbl_auth_user where user_id='$ricardo';";

Mais uma vez está incorrecto, deverás usar a variável óbvia neste caso, a variável username


De resto parece estar tudo certo... mas para correres isto, não é pores as passwords no ficheiro php, mas sim no formulário em html, quando o corres no Firefox/IE. Experimenta agora correr os ficheiro html (dentro do xammp claro).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é assim, eu tenho uma tabela na minha base de dados chamada tbl_auth_user com dois campos. o 1º o user_id = ricardo, e o user_password= coelhor. daí eu usar esta linha de codigo:

"select user_password from tbl_auth_user where user_id='$ricardo';";

entendes softclean?

ja pus td dentro da pasta xampp, e na pasta htdocs, corri o html, pus o nome ricardo e a pass coelhor e n deu :S aparece sempre a mm mensagem.

"consegui efectuar o login..." ; } else // aqui as pass's sao diferentes { echo "

password errada ou entao o numero de utilizador"; } } else // aqui temos que $num=0 { echo "

houve um erro, nao foi possivel efectuar o login, numero de utilizador invalido..."; } // desligar a ligacao a base de dados... mysql_close($conectar); ?>"

se reparares são as ultimas linhas de codigo :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, eu entendi, mas se quiseres ter mais de um user, tens de perguntar qual quer aceder, e por isso é que está o html, para perguntar ao user o que ele quer.

Depois, o outor problema, eu nnão sei se estará correcto, mas experimenta trocar

echo "<br>consegui efectuar o login..." ;

para

echo "<br>consegui efectuar o login...";

O ponto e virgula no fim sem espaço a separar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem, continua a dar o mesmo problema. como posso entrar em contacto directo ctg softclean? olha, adiciona-me no msn. ricardocoelho81@portugalmail.pt pode ser? e assim qd tivermos on-line falamos e ajudas-me. obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu adicionei. Mas olha, não sei se estás interessado, mas tenho aqui outro "produto" para te "vender"  ;)

Este é o script que costumo usar para iniciar sessões. Pode ser que seja útil, mas de forma mais simples, eu comentei as linhas, de forma a que percebas o que se passa a cada instante.

<?php
//Script para fazer login

//criar uma ligação com a base de dados
$conectar=mysql_connect("localhost", "13137","jokjHp" ) or die ("Falhou ligar a base de dados...");

//seleccionar a base de dados pretendida
//notar que não é preciso ocupar uma variavel para ver se foi seleccionada, pois o die tratará do erro, caso exista
mysql_select_db("projecto", $conectar) or die ("Falhou..base de dados desconhecida....");

//Agora vamos tratar de limpar as variáveis para que não ocorra a situação de SQL Injection, que te foi referida anteriomente
//o que este código faz é substituir caracteres especiais que te poderiam mudar a query
//ver mais em http://php.net/mysql_real_escape_string e ainda em http://en.wikipedia.org/wiki/SQL_injection
mysql_real_escape_string($_POST[]);

//e agora vamos coloca-las em variáveis
$utilizador = $_POST['nome'];
$chave = $_POST['pass']

//agora vamos fazer a query
// a pesquisa pretendida 
$pesquisa="select user_id from tbl_auth_user where user_id='$utilizador' and user_password='$chave'";

//efectuar a pesquisa na base de dados : projecto
//com um die, para verificar se há algum erro na pesquisa. Podes ver o que faz a função mysql_error() em http://php.net/mysql_error
$resultado=mysql_query($pesquisa) or die(mysql_error());

// aqui vamos obter o numero de resutados obtidos (   linhas ... )
$num=mysql_num_rows($resultado);

//Logica: Se há um utilizador a fazer login, entao temos 1 linha na query, se estiver tudo certo, temos entao
//se num_linhas == 1 entao
//	passou, login com sucesso
//senao
//	falhou, porque os dados estão incorrectos
if($num!=1){
	echo "Login com sucesso!";
}else{
	echo "Falhou no login, tente novamente!";
}

// desligar a ligacao a base de dados... 
//nao é obrigatório, uma vez que por default, a ligação é fechada automaticamente
mysql_close($conectar);
?>

Não necessitas de mudar o teu codigo HTML.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ou seja, ele esta a conectar ao mysql com os meus dados username: 13137 password: jokjHp.

eu kero que ele valide o login qd eu puser um username e password mas q esteja dentro da tabela login q eu criei na minha base de dados, e ele ta a fazer um login correcto só qd ponho os dados do meu mysql ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Entao vamos definir uma coisa:

- A password do sql (onde tens a instrução mysql_connect) fica so para esse efeito, ela fica lá, pronto.

- Em vez de correres o script php, primeiro vais ao html, e poes la os dados de login., depois o resto do processo é automatico, nao precisas de por as tuas passes da tabela users no script (apenas precisa de estar la a pass de sql, que ja está em cima).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

oh softclean, mas o utilizador tem d inserir dados na textfield do html. vou receber esses dados e compara-los com as passwords dos users da tabela user entendeS? n tou a perceber o k pretendes ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ois

Tenho aqui um feito por mim, podes tirar ideias daqui.

Atençao k isto foi so para + ou - perceber como isto se faz, os pros k depois digam os erros e as alteraçoes a fazer.

Ficheiro Functions.php

<?php
function Tentar_Login($FNome, $FPass)
{
include "DB_Configs.php"; // Aqui eh onde tao estas variaveis DB_Host, DB_User, DB_Pass.
$Conectar=mysql_connect(DB_Host, DB_User, DB_Pass) Or Die("Falhou conectar á base de dados");
mysql_select_db(DB_Name, $Conectar) Or Die("Base de dados desconhecida");
$Query="SELECT Nome, Pass FROM Utilizador WHERE Nome='$FNome'";
$Resultado=mysql_query($Query);
$Num=mysql_num_rows($Resultado);
if ($Num != 0)
{
	list($Nome, $Pass) = @ mysql_fetch_row($Resultado);
	$FPass=md5($FPass);
	If ($FPass == $Pass)
		return true;
	else
		return"Password incorrecta.";
}
else
	return "Nome não existe.";
}

function Confirmar_Login()
{
//	session_start();
if (isset($_SESSION["F_Nome"]))
	return True;
else
	return False;
}
?>

Ficheiro Index.php

<?php
include "Functions.php";
$ErroLogin=False;
$StrErroLogin=" ";
if (isset($_POST["SubmitInput"]))
{
if (isset($_POST["Nome"]))
	$F_Nome=$_POST["Nome"];
if (isset($_POST["Pass"]))
	$F_Pass=$_POST["Pass"];
if (empty($F_Nome) || empty($F_Pass))
{
	$ErroLogin=True;
	$StrErroLogin="Dados Incompletos";
}
Else
{
	$Func_Return=Tentar_Login($F_Nome, $F_Pass);
	if ($Func_Return=="True")
	{
		session_start();
		$_SESSION['F_Nome']=$F_Nome;
	}
	else
	{
		$ErroLogin=True;
		$StrErroLogin=$Func_Return;
	}
}
}
?>

<?php
if (Confirmar_Login())
{
?>
<html>
<head>
<title>Index</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script language="JavaScript">
</script>
</head>
<body>
<span>Pagina principal.<?php echo $_SESSION["F_Nome"] ?></span><a href="Principal.php">eee</a>
<?php
}
else
{
?>
<html>
<head>
<title>Index</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<STYLE TYPE="text/css">
#TableLogin {
background-color:#CCCCC0;
border:1 solid #000000;
}
</STYLE>
<script language="JavaScript">
</script>
</head>
<body>
<table width="100%" heigth="100%" cellspacing="0" cellpadding="0">
<tr>
	<td align="center" valign="bottom">
		<table width="1" id="TableLogin" cellspacing="0" cellpadding="0">
			<?php if ($ErroLogin==True) {
			?>
			<tr>
				<td align="center" valign="top" height="30" colspan="2"><span><b>Erro no login.</b></span></td>
			</tr>
			<tr>
				<td align="center" valign="top" height="30" colspan="2"><span><b><?=$StrErroLogin ?></b></span></td>
			</tr>
			<?php } ?>
			<tr>
				<td align="center" valign="top" height="30" colspan="2"><span>Por favor faça o login.</span></td>
			</tr>
			<tr>
				<form method="post" action="<? echo $_SERVER['PHP_SELF']; ?>">
				<td align="right"><span>Nome : </span></td>
				<td> <input type="text" name="Nome" value="" size="20" maxlength="50" /></td>
			</tr>
			<tr>
				<td><span>Password : </span></td>
				<td> <input type="password" name="Pass" value="" size="20" maxlength="32" /></td>
			</tr>
			<tr>
				<td align="center" colspan="2"><input type="submit" name="SubmitInput" value="Login" /></td>
				</form>
			</tr>
		</table>
	</td>
</tr>
</table>
<?php
}
?>
</body>
</html>
<?php
?>

Ficheiro Principal.php

<?php
include "Functions.php";
session_start();
if (!Confirmar_Login())
Header("Location: Index.php");
?>
<html>
<head>
<title>Principal</title>
<script language="JavaScript">
</script>
</head>
<body>
<span>Pagina principal 2.<?php echo $_SESSION["F_Nome"] ?></span>
</body>
</html>

Repara k nao previne o SQL Injection e a maneira k eu uso para ver se a sessao esta aberta tb nao presta.

Ah pouco tempo li estes 2 posts :

http://www.portugal-a-programar.pt/index.php?showtopic=3797

http://forums.ptsec.net/linguagens_web/artigo_vulnerabilidades_em_aplicacoes_web-t1117.0.html

e falei com o djthyrax e ele disse me k a melhor maneira de verificar a sessao eh esta:

Crias uma HASH dos headers do cliente quando ele faz o login e a cada pedido do cliente voltas a fazer uma nova HASH dos headers e comparas com a k ja tinhas.

//Para gerar o hash de verificação
foreach($_SERVER as $k => $v) if(!strstr($k, "REFERER") && substr($k, 0, 5) == "HTTP_") $dadosDeVerificacao[$k] = $v;
$hash = md5(serialize($dadosDeVerificacao));

//Verificacao
if($hashNoServer != $hashGeradoNoMomento){
    $_SESSION = array();
    session_destroy();
    header("Location: login.php");
}

Espero nao estar a dizer nada de errado, os pros k confirmem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outra coisa eu quando vou ver se os dados sao correctos na funçao Tentar_Login se o nome nao existir digo k o nome nao existe e

se a password for incorrecta tb o digo e isto nao se deve fazer, deve se dizer k os dados estao incorrectos pq se um hacker souber

k o nome esta correcto pode tentar usar ataques de dicionario ou brute force.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Têm a noção que estarem a dar-lhe 907087098709708979078098097 exemplos diferentes sem ele perceber 1 sequer só o vai confundir mais?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora