View Full Version : Login n fnciona em todos os servidores


Umbus
16-10-2007, 12:07
Boas eu tenho um sistema de login em php, em que tenho na base de dados o user, a pass em md5 tudo em php. agora a mina duvida e a seguinte eu tenho esse sistema em dois servidores mas num nao me funciona igualzinho, algum pode-m dar um link de um login que funcione em todos os servidores?

spastikman
16-10-2007, 12:18
Boas eu tenho um sistema de login em php, em que tenho na base de dados o user, a pass em md5 tudo em php. agora a mina duvida e a seguinte eu tenho esse sistema em dois servidores mas num nao me funciona igualzinho, algum pode-m dar um link de um login que funcione em todos os servidores?




Se está bem feito, é provavel que não funcione porque o SGBD deve estar a correr no localhost. logo o php alojado no mesmo server, corre. No outro servidor não corre.

Se não quiseres/puderes abrir o serviço para o exterior, podes sempre autenticar via http (ou https para ser mais seguro).

msdevweb
16-10-2007, 12:38
tens que tomar atençao a uma coisa, que tipo de "sessao" usa o teu sistema de login, se for autenticaçao com escrita e definiçoes em cookies deve funcionar perfeitamente, se for autenticaçao "simples" como session_start(), session['var']; tens que tomar atençao com as permissoes do php, porque dessa forma o php utiliza uma directoria no servidor para "session trash", e se nao tiveres essa directoria definida com as devidas permissoes simplesmente nao corre, ja que é incapaz de criar a sessao. Mesmo com cookies tens que ter atençao as variaveis definidas no php.ini do servidor.

Caso o sistema funcione (sessoes) é sinal que tens algo mal definido. Se aparece algum erro mostra-o aqui.


help @ http://www.php.net/session

cumps

Umbus
16-10-2007, 15:50
Antes demais obrigado pela ajuda, eu tenho o config bem :). Agora a unica diferença entre servidores e que o velho e a versao 4 e o novo a versao 5 :):
login:
<Form method="post" action="autentificar.php">
Nome:
<input type="text" name="utilizador"><br>
Password:
<input type="password" name="password"><br>
<input type="submit" value="enviar dados">
</form>


Autentificar:
<?
include("config.php");
$utilizador = mysql_real_escape_string($_POST[utilizador]);
$password = mysql_real_escape_string($_POST[password]);
$password = md5($password);
$status = authenticate($utilizador, $password);
if ($status == 1)
{
session_start();
session_register("SESSION");
session_register("SESSION_login");
$SESSION_login = $utilizador;
header("Location: administrar.php");
exit();
}
else
{
header("Location: erro.php");
exit();
}
function authenticate($outilizador, $apassword)
{
include("config.php");
global $ligar;
$connection = mysql_connect($host, $user, $pass) or die("Incapaz de conectar à base de dados!");
mysql_select_db($db, $ligar) or die("Incapaz de selecionar à base de dados!");
$query = "SELECT id from lusoanime_utilizador WHERE utilizador = '$outilizador' AND password = '$apassword'";
$result = mysql_query($query, $ligar) or die ("Erro na query: $query. " . mysql_error());
if (mysql_num_rows($result) == 1)
{
return 1;
}
else
{
return 0;
}
}
?>



ADministrar:
<?php
session_start();
if (!session_is_registered("SESSION"))
{
header("Location: erro.php");
exit();
}
?>

msdevweb
16-10-2007, 16:01
ora ai esta o problema :P ou muito provavelmente...

o session_register no php5 manda-te dar uma volta a nao ser que tenhas o register_globals definido, o que no php 5 esta por defeito desactivado, logo o session_register/unregister/is_registered nao funcionam..... o que te aconselho sera substituires o session_register("VARIAVEL") por $_SESSION['VARIAVEL']="valor_a_atribuir_a_variavel"; nao necessitas de registar variaveis... para verificares se uma variavel existe isas o if(isset($_SESSIO['VARIAVEL'])) {}

com essas alteraçoes deve funcionar...

depois diz se funcionou ou nao...

p.s. nao é necessario fazeres 2 versoes do mesmo sistema, ja que o $_SESSION tambem funciona no php4 :) e alem disso é considerado "BEST PRACTICE".
cumps.

K0mA
16-10-2007, 16:08
Não sei se será isto:
$utilizador = mysql_real_escape_string($_POST["utilizador"]);
$password = mysql_real_escape_string($_POST["password"]);

Se não funcionar mete assim:


$utilizador = $_POST["utilizador"];
$password = $_POST["password"];
$utilizador = mysql_real_escape_string($utilizador);
$password = mysql_real_escape_string($password);


Se não funcionar...

msdevweb
16-10-2007, 16:19
K0mA (http://www.techzonept.com/member.php?u=28225) :
Provavelmente o problema é daquilo que falei, ja que o mysql_real_escape_string "pode" ser usado assim, e alem disso ele ja funcionava no php 4, logo o erro so pode ser por causa de um dos updates que o php5 trouxe...

:p
cumps.

Umbus
16-10-2007, 19:46
Yupi, era exactamente isso msdevweb. Obrigadao pela ajuda, ja tava a desesperar :P. Agradecimentos a todos os que me ajudaram, K0mA obrigado pelo apoio ;).

Umbus
16-10-2007, 23:37
Nop, afinal nao funciona, ele faz o login mas na administraçao ele entra mesmo que nao tenha sessao :S.

<?php
session_start();
if (isset($_SESSION['SESSION_USERNAME']))
{
header("Location: erro2.php");
exit();
}
?>

msdevweb
17-10-2007, 07:21
olha la bem a lógica do que tens escrito em cima... lol :)
se a variavel $_SESSION['SESSION_USERNAME'] estiver definida, manda-se o user para erro2.php este erro é uma pagina de erro no login certo? Estranho nao? lol devia ser precisamente o contrario. Esperimenta colocar um !antes do isset, algo como
<?php
session_start();
if (!isset($_SESSION['SESSION_USERNAME'])) //quer dizer se nao estiver definida :) aí é que se manda o user para erro2.php
{
header("Location: erro2.php");
exit();
}
?>

Umbus
18-10-2007, 11:19
Agora o administrador esta bom ele nao vai para a administraçao sem fazer o login, o problema e que ele vai directamente ao erro2. Ou seja ele faz o login correctamente mas quando vai ao admin parece que vai sem sessao:

login:
<form action="autentificar.php" method="post">
<p>Utilizador:<br />
<input type="text" size="20" name="utilizador" />
<br />
Password:<br />
<input type="password" size="20" name="password" />
<br />
<input type="submit" name="submit" value="Login">
</p>
</form>



Autentificar:
<?
include("config.php");
$f_user = mysql_real_escape_string($_POST[utilizador]);
$f_pass = mysql_real_escape_string($_POST[password]);
$f_pass = md5($f_pass);
$status = authenticate($f_user, $f_pass);

// if user/pass combination is correct
if ($status == 1)
{
session_start();
$_SESSION["SESSION_USERNAME"] = $f_user;
header("Location: administrar.php");
exit();
}
else
// user/pass check failed
{
// redirect to error page
header("Location: erro.php");
exit();
}

// authenticate utilizador/senha against a database
// returns: 0 if utilizador and senha is incorrect
// 1 if utilizador and senha are correct
function authenticate($theuser, $thepass)
{
// configuration variables
include("config.php");
global $ligar;

//connect to database
$ligar = @mysql_connect($host, $user, $pass) or die("Incapaz de conectar à base de dados!");

//select database
@mysql_select_db($db, $ligar) or die("Incapaz de selecionar à base de dados!");

//query string
$query = "SELECT id from blogumbus_utilizador WHERE utilizador = '$theuser' AND password = '$thepass'";

//store query in a variable
$result = @mysql_query($query, $ligar) or die ("Erro na query: $query. " . mysql_error());

// if row exists -> user/pass combination is correct
if (mysql_num_rows($result) == 1)
{
return 1;
}
// user/pass combination is wrong
else
{
return 0;
}
}
?>


O uqe se passara? :S

msdevweb
18-10-2007, 12:18
"o problema e que ele vai directamente ao erro2"

isso acontece quando???

no administrar.php so tens que ver se !isset($_SESSION['SESSION_USERNAME']) e pode ainda ver o length da variavel da sessao. algo como:

session_start();

//para efeitos de debug faz:
echo "S_USER: ".$_SESSION['SESSION_USERNAME'];
echo "<br />S_STRLEN:".strlen($_SESSION['SESSION_USERNAME']);

if(!isset($_SESSION['SESSION_USERNAME']) || strlen($_SESSION['SESSION_USERNAME'])<1 || $_SESSION['SESSION_USERNAME']==null) header("Location: erro2.php");

esperimenta assim para ver no que dà.


cumps.

Umbus
19-10-2007, 11:00
Acontece quando faço o login e vou para aadministraçao...O erro nao e um bug :(. Ele nao tem a sessao feita quando esta na admin. Ele assim da o mesmo erro, e so com o primeiro codigo nao aparece nada:
S_USER:
S_STRLEN:0

msdevweb
20-10-2007, 08:02
Ouve... nao leves a mal, mas a tua duvida esta cada vez mais estranha (e as tusa explicaçoe ainda pioram tudo...)
tens o session_start(); em todas as paginas que usam as variaveis da sessao? no autenticar.php e administrar.php ?? se tens isso era suposto funcionar, e se mesmo assim nao funciona, é porque a sessao nao esta a ser criada... estas a usar isso no localhost ou online? tens que ter atençao às variaveis do php.ini, vê: http://php.net/session e verifica se esta tudo como deve estar, para teres acesso as variaveis do php, cria um .php com <?php php_info(); ?> executa e confirma as variaveis.

cumps.

Umbus
20-10-2007, 18:01
Eu estou a fazer isto na net, Bem entao eu esplicao melhor e mais pausadamente :). Primeiro de tudo faço o login que esta feito assim:
<form action="autentificar.php" method="post">
<p>Utilizador:<br />
<input type="text" size="20" name="utilizador" />
<br />
Password:<br />
<input type="password" size="20" name="password" />
<br />
<input type="submit" name="submit" value="Login">
</p>
</form>
Depois ele vai para autentificar.php onde verifica se o login e falso ou nao, e verifica na base de dados, caso o login seja verdadeiro ele faz uma nova sessao com o nome do login:
include("config.php");
$f_user = mysql_real_escape_string($_POST[utilizador]);
$f_pass = mysql_real_escape_string($_POST[password]);
$f_pass = md5($f_pass);
$status = authenticate($f_user, $f_pass);

if ($status == 1)
{
session_start();
$_SESSION["SESSION_USERNAME"] = $f_user;
header("Location: administrar.php");
exit();
}
else
{
header("Location: erro.php");
exit();
}
function authenticate($theuser, $thepass)
{
include("config.php");
global $ligar;
$ligar = @mysql_connect($host, $user, $pass) or die("Incapaz de conectar à base de dados!");
@mysql_select_db($db, $ligar) or die("Incapaz de selecionar à base de dados!");
$query = "SELECT id from blogumbus_utilizador WHERE utilizador = '$theuser' AND password = '$thepass'";
$result = @mysql_query($query, $ligar) or die ("Erro na query: $query. " . mysql_error());
if (mysql_num_rows($result) == 1)
{
return 1;
}
else
{
return 0;
}
}
Depois desta parte ele vai para uma pagina de erro caso o login esta incorrecto, ou para a pagina administrativa caso o login esta incorrecto. Dentro da pagina de administração ele verifica se tenho a sessao iniciada:
session_start();
if (isset($_SESSION['SESSION_USERNAME']))
{
header("Location: erro2.php");
exit();
}
include("config.php");

E e aqui que em vez de continuar na administraçao nao fica, e como se a sessao nao tivesse sido criada (como ja foi visto).

AliFromCairo
20-10-2007, 19:51
session_start();
if (isset($_SESSION['SESSION_USERNAME']))
{
header("Location: erro2.php");
exit();
}
include("config.php");

E e aqui que em vez de continuar na administraçao nao fica, e como se a sessao nao tivesse sido criada (como ja foi visto).

Tu nesse caso estás a redireccionar o utilizador no caso de a sessão já ter sido criada. Penso que o que tu queres fazer é precisamente o contrário.

msdevweb
21-10-2007, 11:14
Epah... ja te tinha dito que na pagina administrativa tinhas que mudar aquilo, como o AliFromCairo disse e como eu ja tinha dito mais em cima:

tens if(isset($_SESSION['SESSION_USERNAME'])) envias para o erro2.php, outra vez: estas a dizer se a variavel da sessao estiver registada o user vai para o erro2.php, logo isto nao tem logica... como te disse:

if(isset($_SESSION['SESSION_USERNAME'])) tem que levar a condiçao negativa (!):

if(!isset($_SESSION['SESSION_USERNAME'])) {

}

Ve la se assim nao funciona.

cumps.

Umbus
21-10-2007, 11:20
Eu e que me enganei, eu ja tinha feito o que tinhas dito o admin esta assim:

session_start();

//para efeitos de debug faz:
echo "S_USER: ".$_SESSION['SESSION_USERNAME'];
echo "<br />S_STRLEN:".strlen($_SESSION['SESSION_USERNAME']);

if(!isset($_SESSION['SESSION_USERNAME']) || strlen($_SESSION['SESSION_USERNAME'])<1 || $_SESSION['SESSION_USERNAME']==null) header("Location: erro2.php");


Será que ele nao apaga o registo da sessao quando vai para a administraçao?

msdevweb
21-10-2007, 11:25
Bem... ou sou eu que estou a ficar burro ou tens que ter alguma coisa mal configurada no php.ini que impede a tua sessao de ser criada... ja que nao me parece existir algum erro no codigo que mostras... ah... onde tens:
if ($status == 1)
{
session_start();
$_SESSION["SESSION_USERNAME"] = $f_user;
header("Location: administrar.php");
exit();
}

tira o session_start(); de dentro do if. e coloca-o no inicio do documento. de resto ja nao sei o que pode estar mal... ve o site que te disse em cima e confirma as variaveis.

cumps.

SoundSurfer
21-10-2007, 12:22
Por acaso tens algum "_" no url?
É que as cookies não funcionam bem com underscores nos urls.

Umbus
21-10-2007, 14:29
Pois e que eu tambem nao percebo o que se passa :S. Ja agora e config.php e nao .ini XD. Nao o url nao tem _ e ja mudei o session_start(); e nada :( O config.php esta assim:


$host = "localhost";
$user = "***";
$pass = "****";
$db = "****";
$ligar = mysql_connect($host, $user, $pass);
mysql_select_db($db, $ligar);

msdevweb
24-10-2007, 07:23
eu estava mesmo a falar do php.ini, é o ficheiro de configuraçao de parametros de execuçao do php, cria um ficheiro .php novo, e escreve la so: <?php php_info(); ?> e corre-o... e vai à pagina que te disse em cima (www.php.net/session (http://www.php.net/session)) e verifica os parametros session bem como leres com atençao os avisos que la sao feitos....

cumps.