Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marco Polo Viana

Validar sessão

Recommended Posts

Pessoal,

Algum problema no arquivo abaixo de validar sessão a ser incluso em todas as páginas restritas? Ele não deixa validar:

<?php
session_start();
require_once('cnx_dao.php');

if(IsSet($_SESSION["id_usuario"]))
	$id_usuario = $_SESSION["id_usuario"];
if(IsSet($_SESSION["nome_usuario"]))
	$nome_usuario = $_SESSION["nome_usuario"];
if(IsSet($_SESSION["email_usuario"]))
	$email_usuario = $_SESSION["email_usuario"];

if(!(empty($id_usuario) || empty($nome_usuario) || empty($email_usuario)))
{  
	$resultado = mysql_query("SELECT C_USUARI_I_USUARIO, C_USUARI_S_NOME, C_USUARI_S_EMAIL FROM C_USUARI WHERE C_USUARI_I_USUARIO='$id_usuario'");
	if(mysql_num_rows($resultado)==1)
	{
		if($email_usuario != mysql_result($resultado,0,"C_USUARI_S_EMAIL"))
		{
			unset ($_SESSION["id_usuario"]);
			unset ($_SESSION["nome_usuario"]);
			unset ($_SESSION["email_usuario"]);
			echo "<script>alert('Usuário ou Senha não reconhecidos.'); </script>";
			header("Location: index.php");
			exit;
		}
	}
	else
	{	
			unset ($_SESSION["id_usuario"]);
			unset ($_SESSION["nome_usuario"]);
			unset ($_SESSION["email_usuario"]);
			echo "<script>alert('Usuário ou Senha não reconhecidos.'); </script>";
			header("Location: index.php");
		exit;
	}
}
else
{
			unset ($_SESSION["id_usuario"]);
			unset ($_SESSION["nome_usuario"]);
			unset ($_SESSION["email_usuario"]);
			echo "<script>alert('Usuário ou Senha não reconhecidos.'); </script>";
			header("Location: index.php");
		exit;
}

mysql_close($conn);
?>

Tem algo errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

if(!(empty($id_usuario) || empty($nome_usuario) || empty($email_usuario)))

Se nao está vazio usuario,ou se não está vazio nome usuario,ou se não está vazio email usuario.Muda isso que tá errado.

Olha porque:

id usuario = vazio - primeira sentença = false
nome usuario = vazio - segunda sentença = false
email usuario = vazio - terçeira sentença = false
!(FALSE FALSE FALSE)
Resultado:TRUE - entra no if
Ai seu erro

Nas querys,concatena as variaveis pra ganhar em processamento.

Evite processamento desnecessario (houve muito).

 

Troque a estrutura por:

if(!(empty($id_usuario) && empty($nome_usuario) && empty($email_usuario)))

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O verifica_login.php faz a parte dele certinho, se fizer login errado ele não aceita, mas se fizer o login certinho ele chega no index2.php sendo que a valida_sessao.php mata a sessão.

 

saca o esquema completo abaixo:

1 - No index.php temos o envio para o login:

<form method="post" action="valida_login.php">
		<p> 
		  <label>Login (E-mail)</label>
		  <input name="email_usr" id="email_usr" type="text" size="19" />
		  <label>Senha</label>
		  <input name="senha_usr" id="senha_usr"  type="password" size="19" />
		  <br /><br>
		  <input type="submit" class="button" value="Entrar" />

2 - No arquivo valida_login.php a verificação:

<?php 
require_once('cnx_dao.php');

$email_usr = $_POST["email_usr"];
$senha_usr = md5($_POST["senha_usr"]);

if(empty($email_login) || empty($senha_login))
{
header("Location: index.php");
} else {
$sql_login  = mysql_query("SELECT C_USUARI_I_USUARIO, C_USUARI_S_NOME, C_USUARI_S_EMAIL FROM C_USUARI WHERE C_USUARI_S_EMAIL='$email_usr' AND C_USUARI_S_SENHA='$senha_usr'");
$rows_login = mysql_num_rows($sql_login);

if($rows_login!=0)
{
$mostra_usuario = mysql_fetch_array($sql_login);

session_start();

$_SESSION["id_usuario"]		 = $mostra_usuario["C_USUARI_I_USUARIO"]; 
$_SESSION["nome_usuario"]	= $mostra_usuario["C_USUARI_S_NOME"];
$_SESSION["email_usuario"]	= $mostra_usuario["C_USUARI_S_EMAIL"];

header("Location: index2.php");

}else{  
echo "<script>alert('Usuário ou Senha não reconhecidos.'); history.back() </script>";
}
}
@mysql_close();
?>

3 - O arquivo index2.php contém o seguinte:

<?php 
session_start();
require_once('cnx_dao.php');
require_once('valida_sessao.php');
?>

4 - O arquivo valida_sessao.php incluso e,m todas as páginas contém o seguinte:

<?php
session_start();
require_once('cnx_dao.php');

if(IsSet($_SESSION["id_usuario"]))
	$id_usuario = $_SESSION["id_usuario"];
if(IsSet($_SESSION["nome_usuario"]))
	$nome_usuario = $_SESSION["nome_usuario"];
if(IsSet($_SESSION["email_usuario"]))
	$email_usuario = $_SESSION["email_usuario"];

if(!(empty($id_usuario) || empty($nome_usuario) || empty($email_usuario)))
{  
	$resultado = mysql_query("SELECT C_USUARI_I_USUARIO, C_USUARI_S_NOME, C_USUARI_S_EMAIL FROM C_USUARI WHERE C_USUARI_I_USUARIO='$id_usuario'");
	if(mysql_num_rows($resultado)==1)
	{
		if($email_usuario != mysql_result($resultado,0,"C_USUARI_S_EMAIL"))
		{
			unset ($_SESSION["id_usuario"]);
			unset ($_SESSION["nome_usuario"]);
			unset ($_SESSION["email_usuario"]);
			echo "<script>alert('Usuário ou Senha não reconhecidos.'); </script>";
			header("Location: index.php");
			exit;
		}
	}
	else
	{	
			unset ($_SESSION["id_usuario"]);
			unset ($_SESSION["nome_usuario"]);
			unset ($_SESSION["email_usuario"]);
			echo "<script>alert('Usuário ou Senha não reconhecidos.'); </script>";
			header("Location: index.php");
		exit;
	}
}
else
{
			unset ($_SESSION["id_usuario"]);
			unset ($_SESSION["nome_usuario"]);
			unset ($_SESSION["email_usuario"]);
			echo "<script>alert('Usuário ou Senha não reconhecidos.'); </script>";
			header("Location: index.php");
		exit;
}

mysql_close($conn);
?>

Mas o sistema não deixa efetuar login. O script de login está correto no ban co e os valores das variáveis $_SESSION também pois já testei a exibição delas.

O que pode estar errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

if(!(empty($id_usuario) || empty($nome_usuario) || empty($email_usuario)))

Se nao está vazio usuario,ou se não está vazio nome usuario,ou se não está vazio email usuario.Muda isso que tá errado.

Olha porque:

id usuario = vazio - primeira sentença = false
nome usuario = vazio - segunda sentença = false
email usuario = vazio - terçeira sentença = false
!(FALSE FALSE FALSE)
Resultado:TRUE - entra no if
Ai seu erro

nao é bem assim ...

o empty verifica se a variavel está vazia, entao se ela estiver vazia ele retorna true ...

como ele negou todas as verificações empty, se uma delas retornar False, que significa que a variavel nao esta vazia, a sentença fica True ...

 

esse arquivo valida sessao acho meio inutil ...sabe pq ?

 

as variáveis de sessão nao podem ser alteradas por ninguem ao nao ser você com o proprio script, entao a unica coisa que você esta fazendo e verificar se você mesmo nao alterou os valores das variaveis ...

 

você realiza o login, verifica se o usuario existe e se os dados batem, depois realiza mais uma vez a verificação em cima dos dados que você mesmo obteve do banco ...

 

faça o seguinte:

realize o login corretamente, dê um echo nas variaveis da sessao e confere os dados e um echo diferente seguido de exit dentro de cada IF ...descobrindo em qual IF ocorre o problema fica mais facil ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

na verdade a validação nao é o problema, eu só disse que eu acho que ela é de certa forma não muito funcional ...

 

sobre o problema dessa validação estar matando a sessão toda vez, eu dei uma olhada mas nao achei o problema... realize os teste que eu disse acima, você vai ter que comparar os dados do banco, achar o if problematico ali para resolver o problema

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi qndo você disse que não é muito funcional.. o que você sugere de validação mais funcional? Tipo, nas páginas de acesso restrito só pode acessar se tiver logado. Isso que é a validação do login.

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao é bem assim ...

o empty verifica se a variavel está vazia, entao se ela estiver vazia ele retorna true ...

como ele negou todas as verificações empty, se uma delas retornar False, que significa que a variavel nao esta vazia, a sentença fica True ...

 

esse arquivo valida sessao acho meio inutil ...sabe pq ?

 

as variáveis de sessão nao podem ser alteradas por ninguem ao nao ser você com o proprio script, entao a unica coisa que você esta fazendo e verificar se você mesmo nao alterou os valores das variaveis ...

 

você realiza o login, verifica se o usuario existe e se os dados batem, depois realiza mais uma vez a verificação em cima dos dados que você mesmo obteve do banco ...

 

faça o seguinte:

realize o login corretamente, dê um echo nas variaveis da sessao e confere os dados e um echo diferente seguido de exit dentro de cada IF ...descobrindo em qual IF ocorre o problema fica mais facil ...

Amigo,reveja.

se variavel tal está vazia faz { } - se tiver vazia retorna true

não(se variavel tal está vazia faz) - se NÃO estiver vazia faz

não(se variavel tal está vazia ou variavel tal esta vazia) - se estiver vazia faz.

Empty(variavel) - ta vazio?true.Não ta?false.

não(empty variavel ou empty variavel ou empty variavel) - primeira ta vazia?não - false.E a segunda?não - false.Terceira?...não - false.Negação false = true - entro no if.

Do jeito que ele colocou...(citado acima)está errado.

E...isso aqui:

if(empty($email_login) || empty($senha_login))

Não seriam:

if(empty($email_usr) || empty($senha_usr))

E o que o outro amigo disse sobre validar sessões (puxa do db...akilo q ta na sessao),é desnecesserio já que o id da sessão foi criado no computador do usuario,já os dados,no servidor (impossivel o usuário criar,pode roubar [conhecido como cssf]),então,se o servidor quem criou os dados,não precisa validar,apenas puxe do db...a partir dakilo os dados que precisar (exibir dados pessoais por exemplo).

Abraço!

 

Ps:dexei confuso e desorganizado,mas deu pra entender.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então o que você está dizendo é que validar a sessão é desnecessário, isso? Entendi estudando que deve ser feito da seguinte forma:

 

1 - Login pra verificar se usuário existe;

2 - Após verificar, redireciona à página permitida;

3 - Nas demais páginas que só pode ter acesso logado tem de haver uma validação para não haver acesso direto pela url;

 

Nos scripts acima tentei fazer isso. Mas não conseguindo avançar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 - Página de login,validação dos dados passados pelo usuário.

2 - Se a verificação der ok,seta sessoes com os dados

3 - Verifica a existencia das sessões,se existirem,deixa ele visualizar.

 

No caso,só com sessões,com cookies ou outras superglobais é necessário a checagem do valor das mesmas (podem ser alterados pelo usuário).

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao é bem assim ...

o empty verifica se a variavel está vazia, entao se ela estiver vazia ele retorna true ...

como ele negou todas as verificações empty, se uma delas retornar False, que significa que a variavel nao esta vazia, a sentença fica True ...

 

esse arquivo valida sessao acho meio inutil ...sabe pq ?

 

as variáveis de sessão nao podem ser alteradas por ninguem ao nao ser você com o proprio script, entao a unica coisa que você esta fazendo e verificar se você mesmo nao alterou os valores das variaveis ...

 

você realiza o login, verifica se o usuario existe e se os dados batem, depois realiza mais uma vez a verificação em cima dos dados que você mesmo obteve do banco ...

 

faça o seguinte:

realize o login corretamente, dê um echo nas variaveis da sessao e confere os dados e um echo diferente seguido de exit dentro de cada IF ...descobrindo em qual IF ocorre o problema fica mais facil ...

Amigo,reveja.

se variavel tal está vazia faz { } - se tiver vazia retorna true

não(se variavel tal está vazia faz) - se NÃO estiver vazia faz

não(se variavel tal está vazia ou variavel tal esta vazia) - se estiver vazia faz.

Empty(variavel) - ta vazio?true.Não ta?false.

não(empty variavel ou empty variavel ou empty variavel) - primeira ta vazia?não - false.E a segunda?não - false.Terceira?...não - false.Negação false = true - entro no if.

Do jeito que ele colocou...(citado acima)está errado.

E...isso aqui:

if(empty($email_login) || empty($senha_login))

Não seriam:

if(empty($email_usr) || empty($senha_usr))

E o que o outro amigo disse sobre validar sessões (puxa do db...akilo q ta na sessao),é desnecesserio já que o id da sessão foi criado no computador do usuario,já os dados,no servidor (impossivel o usuário criar,pode roubar [conhecido como cssf]),então,se o servidor quem criou os dados,não precisa validar,apenas puxe do db...a partir dakilo os dados que precisar (exibir dados pessoais por exemplo).

Abraço!

 

Ps:dexei confuso e desorganizado,mas deu pra entender.

 

 

:blink: :blink: :blink:

 

hehehehe, cara ta precisando dar uma melhorada nas explicações...

 

 

mas depois de pensar um pouco entendi ...

 

e você continua errado...veja bem, quando a sessao é criada ela TEM QUE ENTRAR NO IF pq ele quer verificar se o email existe no banco, e ainda comparar o email do banco com o armazenado com a sessão ...

 

entao ele só realiza isso se uma das sentenças empty(variavel) retornar FALSE, que quer dizer que ela não esta vazia pq recebeu alguma coisa da sessao ... sacou ??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu codigo esta quase certo, tente fazer o seguinte:

 

- No arquivo que valida_sessao.php, troque isso:

<?php
session_start();
require_once('cnx_dao.php');

if(IsSet($_SESSION["id_usuario"]))
	$id_usuario = $_SESSION["id_usuario"];
if(IsSet($_SESSION["nome_usuario"]))
	$nome_usuario = $_SESSION["nome_usuario"];
if(IsSet($_SESSION["email_usuario"]))
	$email_usuario = $_SESSION["email_usuario"];

if(!(empty($id_usuario) || empty($nome_usuario) || empty($email_usuario)))
{ 
...

por isso:

if (isset($_SESSION["id_usuario"]) && isset($_SESSION["nome_usuario"]) && isset($_SESSION["email_usuario"])){
	$id_usuario = $_SESSION["id_usuario"];
	$nome_usuario = $_SESSION["nome_usuario"];
	$email_usuario = $_SESSION["email_usuario"];
	// ... restante do codigo

- Utilize apenas uma vez o session_start();

- Ao interagir o email do usuário com o banco de dados, utilize alguma função para evitar o SQL Injection, como o addslashes.

 

Tente isso e retorna ae o resultado pra gente.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

blink.gif blink.gif blink.gif

hehehehe, cara ta precisando dar uma melhorada nas explicações...


mas depois de pensar um pouco entendi ...

e você continua errado...veja bem, quando a sessao é criada ela TEM QUE ENTRAR NO IF pq ele quer verificar se o email existe no banco, e ainda comparar o email do banco com o armazenado com a sessão ...

entao ele só realiza isso se uma das sentenças empty(variavel) retornar FALSE, que quer dizer que ela não esta vazia pq recebeu alguma coisa da sessao ... sacou ??

Estava errado sim...

Estava/estou meio desatento.

O if está correto sim.

Desculpe ai amigo.

Responderei com mais atenção na proxima.

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não.. não loga. Tente fazer de outra forma mas tbm nao deu. Mas acredito na situação acima faltando acertar a lógica mas a metodologia é essa:

enviar dados de login -> validar login -> acessar página restritta -> verificar sessão em todas as páginas restritas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.