View Full Version : Login n fnciona em todos os servidores
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
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.
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.
Yupi, era exactamente isso msdevweb. Obrigadao pela ajuda, ja tava a desesperar :P. Agradecimentos a todos os que me ajudaram, K0mA obrigado pelo apoio ;).
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();
}
?>
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.
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.
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.
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.
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.
|
|