Problema sessoes php

Fabriziopt

Power Member
Boas estive a investigar no livro php5 e encontrei o seguinte codigo que apliquei no meu site
Mas na hora do login não aceita o registo
O codigo que inseri foi o seguinte

Código:
index.html
<html>
<head><title>Login</title></head>
<body>
<form action="main.php" method="post">
Sistema Auntenticado dp Site.<br>
Login: <input type="text" name="nickname" ><br>
Senha: <input type="password" name="password" ><br>
<input type="submit" value="Entrar" />
</form>
</body></html>

main.php
<?php 
// Login/sessão
// index.php 


include("auth.php"); 

include("nav.php"); 

echo "Esta é a homepage.";
echo "<br><br>Utilizador - " . $_SESSION['nickname']; 

// Fechar a ligação ao mysql
mysql_close(); 
?> 

auth.php

<?php 
session_start(); 
// auth.php 
// start session 

include("connectDB.php"); 

if($_POST){ 
$_SESSION['nickname']=$_POST["nickname"]; 
$_SESSION['password']=$_POST["password"]; 
} 

// query 
$result=mysql_query("select * from users where login='" . $_SESSION['nickname'] . "' and password='" . $_SESSION['password'] . "'"); 

// número de registos 
$num=mysql_num_rows($result); 
// se não há registos aparece o ecrã de login. 
if($num < 1){ 
echo "Não está autenticado. Faça login sff.<br><br> 

<form method=POST action=index.php> 
Utilizador: <input type=text name=\"nickname\"> 
password: <input type=password name=\"password\"> 
<BR> <BR> <BR> <BR>
<input type=submit value=\" - Login - \"> 
</form>"; 

exit; 
} 
?> 

nav.php

<?php 
// nav.php 
?> 

<a href=index.php>Home</a> | 
<a href=pag_1.php>pagina_1</a> | 
<a href=pag_2.php>pagina_2</a> | 
<a href=pag_3.php>pagina_3</a> | 
<a href=logout.php>logout</a> 

<br><br> 

connectdb.php

<?php 
// connect.php 


$hostname="onde esta a base de dados"; 
$mysql_login="ninkname"; 
$mysql_password="senha"; 
$database="nome dabase de dados"; 

if (!($db = mysql_connect($hostname, $mysql_login , $mysql_password))){ 
die("impossível ligar ao MySQL."); 
}else{ 
if (!(mysql_select_db("$database",$db))) { 
die("Impossível ligar a db."); 
} 
} 
?>
Amigos o que estou a fazer de mal
Obrigado pela disponibilidade
Abraço
 
Última edição pelo moderador:
Não procurei pelo erro mas vi aí duas coisas que deves mudar.

Primeiro, nunca se cria uma sessão antes de verificares na base de dados se o utilizador realmente existe. Neste caso tu atribuis a uma sessão o valor do campo e isso é incorrecto moralmente.
Outra coisa, tenta por sempre aspas no sítio certo, um exemplo <form method='POST'> e não form method=POST>

Só por questões de validação!

O que queres dizer com não aceita o registo ??

O teu sistema está vulnerável a SQL Injection( atenção a isto, MUITA ATENÇÃO)

Depois tens isto, mysql_select_db("$database",$db)

não podes por aspas ali, a $database já é uma string, não precisa de aspas!

Em programação, 0 quer dizer false.

quando fazes
$num = mysql_num_rows();

isto é usar espaço de memória sem ser preciso, mais valia fazeres if(mysql_num_rows())
isto só entrava se retornar-se true, ou seja, qualquer número diferente de zero.!
 
Última edição:
Não procurei pelo erro mas vi aí duas coisas que deves mudar.

Primeiro, nunca se cria uma sessão antes de verificares na base de dados se o utilizador realmente existe. Neste caso tu atribuis a uma sessão o valor do campo e isso é incorrecto moralmente.
Outra coisa, tenta por sempre aspas no sítio certo, um exemplo <form method='POST'> e não form method=POST>

Só por questões de validação!

O que queres dizer com não aceita o registo ??

O teu sistema está vulnerável a SQL Injection( atenção a isto, MUITA ATENÇÃO)

Depois tens isto, mysql_select_db("$database",$db)

não podes por aspas ali, a $database já é uma string, não precisa de aspas!

Em programação, 0 quer dizer false.

quando fazes
$num = mysql_num_rows();

isto é usar espaço de memória sem ser preciso, mais valia fazeres if(mysql_num_rows())
isto só entrava se retornar-se true, ou seja, qualquer número diferente de zero.!

obrigado pela resposta
quando tento aceder ao site da a pagina de login
quando ponho os dados nao sao aceites vai para o index.php
abraço
 
index.php? Tens um index.html e um main.php. A qual te referes?

E toma muita atenção ao que o Gurzi disse. Esse código não deve nunca ser usado na vida real, porque é facilmente contornado através de SQL Injection. Quando isso funcionar (ou seja, com um certo user e pass ele entra; com dados incorrectos dá erro), experimenta usar a seguinte string num campo qualquer:

Código:
' OR 1=1 -- .
(acho que esta string é a mais famosa, em relação a SQL Injection)


O código aparenta-me estar ok, salvo o que o Gurzi já disse. Certifica-te de que tens dados na base de dados, na tabela certa ;)
 
desclupa a nabice mas o que e a string ejection?
em que pagina ponho esse codigo?
No codigo eu ponho a db mas nao ponho a tabela onde ponho a tabela?

abraço
 
Ok, para já esquece o SQL Injection. Mas é só para já!

Como é que está a tua base de dados? Tem a tabela "users"? Essa tabela tem as colunas "login" e "password"? E acrescentaste alguma linha nessa tabela?
 
Portanto

bd: xboxstage
tabela: xboxstage
campos da tabela: nickname | password

nesse caso onde diz
PHP:
$result=mysql_query("select * from users where login='" . $_SESSION['nickname'] . "' and password='" . $_SESSION['password'] . "'");
troca por
PHP:
$result=mysql_query("select * from xboxstage where nickname='" . $_SESSION['nickname'] . "' and password='" . $_SESSION['password'] . "'");
e espero que $database = "xboxstage".
 
Tudo bem, agora tens o código funcional, pelos vistos.

Quando escreves um nome de utilizador E uma password CERTOS, consegues ter acesso ao site. Quando erras algum deles, aparece-te uma página de erro. Até aqui, tudo bem.

Agora, experimenta colocar a linha seguinte no campo do nickname (como se estivesses a escrever um utilizador) e deixa o campo da password em branco (ou escreve nele o que quiseres, tanto faz):

Código:
' OR 1=1 -- .
Depois vem cá dizer o resultado ;)

Já agora, se tiveres as magic_quotes activadas, este código não dará resultado.
 
Última edição:
desculpa mas eu estou alujado no hyperphp e isto as x da me erros ...
Vou me registar no freehostia e ja te digo alguma coisa
obrigado
tou para ver o resultado disto ;)
 
As you wish :P

Username: ' OR 1=1 -- .
Password: (o que quiseres. Até pode ser este comentário!)

Não sei se o freehostia activa automaticamente as magic_quotes. Espero que não :P
 
As novas versões do PHP vêm com essa directiva activa por defeito.
É uma pena :\ começam a haver mais programadores preguiçosos e torna-se mais difícil aprender este tipo de coisas. Já a mim me deu um trabalho danado até descobrir que elas existiam. Estava eu a querer descobrir o que era SQL Injection e estava tudo a dar simplesmente bem demais.

Fabriziopt, acrescenta no início do main.php a seguinte linha:
Código:
@set_magic_quotes_runtime(0);

E faz aquilo de novo. Ainda não testei, mas penso que agora dê.
 
nao funciona...
da senha errada
o que era suposto fazer?

Bah :(

O que se passa é o seguinte:
Este é o teu query:

PHP:
"select * from xboxstage where nickname='" . $_SESSION['nickname'] . "' and password='" . $_SESSION['password'] . "'"
ou seja

PHP:
"select * from xboxstage where nickname='$nickname' and password='$password'

se $nickname = "abc" e $password = "def" então

PHP:
"select * from xboxstage where nickname='abc' and password='abc'

MAS se $nickname = "' OR 1=1 -- ." então

PHP:
"select * from xboxstage where nickname='' OR 1=1 -- .' and password='$password'

O que está após o "--" é comentado. O query executado é o seguinte:

PHP:
"select * from xboxstage where nickname='' OR 1=1"

E isso retorna a tabela toda. Ora, como a tabela toda não dá 0 rows, ele supostamente entra.
Vou ligar o meu servidor e deixar-te "explorar". Tens PM :)
 
Back
Topo