Ir ao conteúdo

Posts recomendados

Postado

Estou desenvolvendo um site , e tem uma vulnerabilidade muito grande . 

O site conta com um página de Login , o usuário sendo validado ele é direcionado a outra pagina , ai que o erro vem .

Quando digitei na url a página em que o usuário é levado á página "entro" , sendo que meu objetivo é apenas fazer que essa página seja acessada quando o usúario logar .

Estou usando php , mysql , html .

Qual a solução ?

Postado

você precisa salvar a sessão para validar o acesso a esse URL antes dela carregar os componentes, pode ser feito através de um gerador de sessão, cookies, informações temporárias (google chrome tem uma ferramenta pra isso).... isso simplificando uma solução 

 

 

Postado

Opa!

Como o colega falou ai...

Cria uma session para o usuário caso o login e senha dele seja autenticado. Ex:

No seu arquivo de login:

//...se usuário autenticado...
session_start();
$_SESSION["login"] = 'S';

No arquivo de sua página que é redirecionada após o login autenticado:

if(isset($_SESSION['login'])){
//permance nesta página
}else{
//direciona para tela de login com alert()...
}

No arquivo de logoff:

unset($_SESSION['login']);

Você pode guardar qualquer valor que seja útil na variável de sessão.

  • Curtir 1
Postado

Quando faço isso, sempre faço usando cookies. Session mesmo você dando unset pode correr o risco dá sessão não ser totalmente destruída. Acho que o jeito "certo" para se fazer isso é usando cookies, não que o session esteja errado, mas todo mundo usa cookies nesse caso.

Crie um cookie, guarde nele o id, o username e o password(criptografado) e seta esse cookie para expirar em um x tempo para que não tenha chance de erro. Nas outras páginas você verifica se esse cookie existe, e guardando o id do usuário no cookie, fica mais fácil de você manipular os dados no banco de dados.

  • Moderador
Postado

@lucassodrem Não existe um jeito "certo"

Pode-se usar tanto cookies quanto sessions.

O unset do session é para liberar as sessões.  Não deve ser usada para fazer um logout.

Se usar sessions, o ideal é usar  session_destroy() destrói todas as sessions do logado, diferente do unset.

 

Eu uso os dois juntos combinados.

 

Desta maneira:

Arquivo de validação de usuário:

<?php

session_start();
	
	$login = $_POST["email"];
	$senha = $_POST["senha"];
	
    //adiciona escapes para prevenir sql injection
	$loginSeguro = addslashes($login);
	$senhaSegura = addslashes($senha);
	
    //testa se o login ou senha está vazio
	if (empty($login) or empty($senha)) :
    echo "<script>
          alert('Preencha todos os campos');
          history.go(-1);
          </script>";
    exit;    
  endif;
	
	
	include 'includes/conexao.php';
	
	$sql = "SELECT * FROM usuario WHERE email ='$loginSeguro' AND DES_DECRYPT(senha) = '$senhaSegura' ";
	$dados = mysqli_query($conecta, $sql);
	$num = mysqli_num_rows($dados);
	
	if ($num == 0):
		echo "<script>
				alert('Usuario ou senha Incorreta');
				history.go(-1);
			  </script>";
		exit;
    else :
		$linha = mysqli_fetch_object($dados);
		$coduser = $linha->idUsuario;
		
        //coloca os dados na sessão
		$_SESSION["codusuario"] = $coduser;
		$_SESSION["email"] = $login;
		
		//insere na tabela de logs as ações do usuário
		$data = date('Y-m-d');
		$log = "INSERT INTO logs(idusuario, idAcao, data, hora) VALUES($coduser, '1', '$data', curtime())";
		$dados2 = mysqli_query($conecta,$log);
		
		
		header ("Location: paginaRestrita.php");
		
	endif;

 

Na página restrita, faço a verificação da sessão e dos cookies:

<?php
//inicia a sessão
session_start();

/*seta os cookies para que não expire o tempo
  isso permite que use a opção de ficar "logado" 
  o true, diz que só pode ser acessado pelo
  protocolo http.
*/
setcookie("ck_authorized", "true", 0, "/");

/*testa se a sessão email não está vazia
  Se estiver, redireciona para a pagina
  de login
*/
if(!isset($_SESSION["email"])):
    header("location: index.php");
else:
    //define que a variável login é a sessão
    $login = $_SESSION["email"];
endif;    
?>

 

E a parte de logout é apenas isto:

<?php
   //inicia a sessão 
	session_start();
   
    //inclui a conexao com o banco de dados
	include 'includes/conexao.php';	

     /*pega a sessão do usuário onde o
       codusuario foi definido que é o ID dele
     */
	$idUsuario = $_SESSION["codusuario"];
	
    //cria um array vazio
	$_SESSION = array();

    /*testa se a sessão foi destruida.
      se true,  insere na tabela logs, a ação
      de logout para deixar registrada
    */   
	if(session_destroy()):
		$data = date("Y-m-d");
		$insere = "INSERT INTO logs(idusuario, idAcao, data, hora) VALUES($idUsuario, '2', '$data', curtime())";
		$dados = mysql_query($insere);
	endif;
	
	//redireciona o usuário para tela de login novamente
	header("location: index.php");
?>	

Como podem vem, esta é o jeito ideal. Digo ideal, porque não existe um jeito certo. Desde que funcione, os meios de como é feito não interessa muito... mas eu acho melhor assim e praticamente elimina a invulnerabilidade.

 

Só atente-se dos SQL injection. existem classes e funções que auxiliam a prevenir.

  • Curtir 3
Postado

@DiF Eu não quis falar que era o jeito certo, se ficou parecendo algo assim, peço desculpas. 

Uma dúvida, o mysql_fetch_object que você usa é a mesma coisa que o mysql_fetch_array só que retorna o array object?

  • Curtir 1
  • Moderador
Postado

@lucassodrem

21 minutos atrás, lucassodrem disse:

mysql_fetch_object que você usa é a mesma coisa que o mysql_fetch_array só que retorna o array object?

Isso, o fetch_object retorna em forma de objeto ao invés de array!

 

Quando se usa o fetch_array,  acessamos os dados por vetor:

$usuario = mysqli_fetch_array($consulta);
echo $usuario["nome"];

Já o fetch_object, permite que acessamos por objeto:

 

$usuario = mysqli_fetch_object($consulta);
echo $usuario->nome;

Particularmente prefiro usar como objeto.  Mas se usar array  não está errado.

 

  • Curtir 1
Postado

:tw_grimace:

@DiF Você tem razão! Esqueci do session_destroy()! Foi porque pensei apenas no exemplo de login do colega. Pensei apenas na sessão do login.

Foi bom você tocar no assunto do injection. É muito importante! Ainda mais se tratando de login.

Sobre o array e objeto é questão de gosto mesmo.

  • Curtir 1
  • Moderador
Postado

@lucassodrem

2 horas atrás, lucassodrem disse:

qual a diferença entre usar a função addslashes do php e mysql_scape_string do mysql?

 Na verdade o  addslashes e  mysql_scape_string, são quase idênticos. Ambos também adicionam barras

A função mysqli_scape_string está obsoleta.  Deve-se usar o mysql_real_escape_string.. mas ela não escapa caracteres especiais.

 

Por isso é bom pegar estas funções e criar uma outra função use elas  para criar uma prevenção de sql injection.

Felizmente no google existe centenas de funções prontas para este tipo de coisa!

 

Mas nada impede de você mesmo cria-la 

  • Curtir 1
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...