Ir para conteúdo

POWERED BY:

Arquivado

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

Leo Araujo

[Resolvido] Proteger site

Recommended Posts

Estou terminando,

O meu sistema em php para o site da minha empresa já está pronto com inserção de dados e relatórios, validações, e página de login, mas restou uma coisa que não sei como fazer.

 

A página de login já faz autenticação com o banco mysql, mas gostaria de saber como faço para que todas as páginas do site certifiquem que o usuário está conectado, para que não aconteça de alguém digitar o endereço para uma página e entrar sem poder.

 

Grato,

Leo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se estiver fazendo autenticação com SESSION, basta adicionar as seguintes linhas nas páginas seguras:

 

<?php
session_start();
if(empty($_SESSION['id'])) header('location: login.php');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se estiver fazendo autenticação com SESSION, basta adicionar as seguintes linhas nas páginas seguras:

 

<?php
session_start();
if(empty($_SESSION['id'])) header('location: login.php');

 

Evandro,

Não fiz por SESSION pq nunca usei, sou novato, fiz com uma validação com query, mas vou dar uma estudada e procurar algo relacionado a session.

 

Obrigado,

Leo

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Se estiver fazendo autenticação com SESSION, basta adicionar as seguintes linhas nas páginas seguras:

 

<?php
session_start();
if(empty($_SESSION['id'])) header('location: login.php');

 

Evandro,

Não fiz por SESSION pq nunca usei, sou novato, fiz com uma validação com query, mas vou dar uma estudada e procurar algo relacionado a session.

 

Obrigado,

Leo

 

É só você fazer o seguinte, na página de validação, dentro do IF (que provavelmente vai ter) você coloca

$_SESSION['acesso'] = true;

e na PRIMEIRA LINHA do seu script para validar coloque

<?php session_start(); ?>
para iniciar a sessão. Se colocar alguma coisa emcima desse comando ele não funciona.

 

Em todas as páginas que precisem de verificação de acesso coloque na primeira linha:

<?php session_start(); ?>
<?php ob_start(); ?>
<?php
if ($_SESSION['acesso'] != true) {
header("login.php");
} else {
?>


Conteudo da página


<?php
}
?>

Session_start() = Inicia a sessão no script, é necessário em todas as páginas que possuem SESSIONS, e somente funciona se for o primeiro comando do script, deve ficar antes mesmo do "<html>", de tudo.

 

Ob_start() = Ativa o buffer de saida, deve ficar logo em seguida do session_start() e em tags php "<?php ?>" separadas (não sei pq, mas comigo é assim)

 

Logica > Se o conteudo da session acesso não for igual a (!=) "true" libera o acesso a página se não (se for true) libera a página.

 

eu coloquei o else e o } no final da página, pois se session acesso não for true enquanto ele carrega o redirecionamento pode mostrar o conteudo da página.

 

Qualquer dúvida, pode perguntar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Júnior, perfeito!

 

Apenas uma pequena consideração:

 

Você não precisa 'taggear' cada comando com <?php ?>. Poderá ter problemas futuros.

 

Se todo o bloco é PHP, é possível mantê-lo dentro de uma tag só:

 

<?php session_start();
ob_start();
if ($_SESSION['acesso'] != true) {
header("login.php");
} else {
?>


Conteudo da página


<?php
}

 

Isso evitaria alguns pequenos problemas futuros como espaçamentos em branco do nada no lay-out ou inclusão de outros headers como cookies ou a própria função header().

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meus caros Junior e Evandro,

Estou entendendo a logica do que vocês me mandaram, mas não está funcionando, não se é pq estou usando com um programa tipo o easyphp simulando um servidor local, o MAMP pra mac, mas vou colar abaixo o que tenho de código, por favor me ajudem mais um pouco.

 

Obrigado

 

Página login.php

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title>Completa Cartuchos</title>

</head>

 

<body>

<h3 align="center">Autenticação</h3><br />

 

<form name="form1" method="post" action="valida.php">

Login: <input type="text" name="nome"><BR>

Senha: <input type="password" name="pwd"><BR>

<input type="submit">

</form>

</body>

</html>

 

Página valida.php

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http-~~-//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http-~~-//www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Completa Cartuchos</title>
<?php 
$link = mysql_connect("localhost:8887", "root", "root");
mysql_select_db("completa", $link);
?>
</head>

<body>
<?php
$login = $_POST["nome"];
$senha = $_POST["pwd"];
$consulta = mysql_query("select * from usuario where usuario='$login'");
$campos = mysql_num_rows($consulta);
if($campos != 0) {
// se o usuario existi verifica a senha dele
       if($senha != mysql_result($consulta,0,"Senha")) {
               echo "<font color=red><b>
                         Senha incorreta!
                         </font></b>";
					  header("Location:login.php");
	}
	 else
	  {
		  session_start();
		  $_SESSION['acesso'] = true ;
		 header("Location:inicio.php");
		  }
		  }
		  mysql_close($link);

?>
</body>
</html>

 

Página inicio.php

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http-~~-//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http-~~-//www.w3.org/1999/xhtml">
<?php 
session_start();
ob_start();
if ($_SESSION['acesso'] != true) {
header("login.php");
} else {
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Completa Cartuchos</title>

</head>
<body>

<h3 align="center">Escolha a Opção Desejada</h3>
<br /><INPUT TYPE="BUTTON" VALUE="Inserir Dados de Serviço" ONCLICK="window.location.href='insdados.php'">

<br /><br /><INPUT TYPE="BUTTON" VALUE="Busca de Serviços Realizados Por Cartucho" ONCLICK="window.location.href='busca.php'">

<br /><br /><INPUT TYPE="BUTTON" VALUE="Busca de Serviços Realizados Por Cliente" ONCLICK="window.location.href='buscasc.php'">

<br /><br /><INPUT TYPE="BUTTON" VALUE="Cadastrar Cliente" ONCLICK="window.location.href='cadcliente.php'">
<?php
}
?>
</body>
</html>

 

 

Não sei porque mas não me dou bem com essa função "header" ainda não consegui fazer ela funcionar no meu código, após postar os códigos acima a alterei na página valida por

 

echo "<script>window.location.href='inicio.php'</script>;

 

e na página início por

 

echo "<script>window.location.href='login.php'</script>";

 

e agora a página que é mostrada é a login.php

 

Imagino que não está funcionando a validação, mas por que?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sistema básico para compreensão do funcionamento:

 

login.php

Login será a única que trabalha de maneira contrária ao sistema, ela verifica se o usuário está logado, para evitar o preenchimento do formulário novamente.

<?php
session_start();
if(!empty($_SESSION['id'])) header('Location: restrito.php'); ?>
<form action="session.php?do=login" method="post">
   <fieldset>
       <legend>Login</legend>
       <p><label for="login_user">Usuário</label><input type="text" name="usr" id="login_user"></p>
       <p><label for="login_pass">Senha</label><input type="text" name="pwd" id="login_pass"></p>
       <p><button type="submit">Login</button></p>
   </fieldset>
</form>

 

session.php

Session é nossa página processadora de sessões. Ela fará o login e logout dos usuários com base no parâmetro do.

<?php
if(empty($_GET['do'] || !in_array($_GET['do'], array('login','logout')) do404Err();

session_start();
if($_GET['do'] === 'login') {
   if($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['usr']) || !isset($_POST['pwd']) do404Err();
   $db = new PDO('mysql:hostname=localhost;dbname=imasters', 'root', '');
   $stmt = $db->prepare('SELECT `id`, `username`, `password` FROM `members` WHERE `username` = ?');
   if(!$stmt->execute($_POST['usr'])) die(array_pop($stmt->errorInfo()));
   $data = $stmt->fetchAll();
   if(!sizeof($data)) die('Usuário não existe.');
   if($data[0]['password'] !== hash('sha512', $_POST['pwd'] . 'sys123')) die('Senha incorreta.');
   $_SESSION['id'] = $data[0]['id'];
   $_SESSION['member'] = $data[0]['username'];
   header('Location: restrito.php');
}

if($_GET['do'] === 'logout') {
   session_start();
   while(sizeof($_SESSION)) array_pop($_SESSION); // Esvaziando a sessão.
   sesson_destroy();
   header('Location: login.php');
}

function do404Err(){
   header('HTTP/1.1 404 Not Found');
   header('Location: ./');
}

 

restrito.php

Funcionamento base de qualquer página que necessite autorização.

<?php

session_start();
if(empty($_SESSION['member'])) {
   header('HTTP/1.1 401 Unauthorized');
   header('Location: login.php');
}

echo '<p>Olá, ' . $_SESSION['member'] .', seja bem vindo!</p>
</p><a href="session.php?do=logout" title="Encerrar a sessão">Fazer logout</a></p>';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evandro,

Gostaria muito de agradecer pela sua paciência e cooperação,

 

Mas criei páginas com os nomes que você colocou no código, mudei apenas os caminhos para servidor e banco de dados e os nomes dos campos para a realidade do meu sistema.

 

O máximo que eu consegui foi uma página em branco com o endereço na barra de endereços do navegador http://localhost:8887/restrito.php?do=login

 

Mais alguma ideia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leo, alguma modificação foi feita de forma incorreta, pois a implementação não previa um restrito.php?do=login

 

Do significa FAZER. Veja, quem faz tudo no exemplo passado é o arquivo session.php. Ele é o nosso cérebro da aplicação.

 

A página login.php implementa a ida (logIN) e a página restrito.php implementa a volta (logOUT) pois é nesta que temos disponível o link para logout.

 

Vou repassar os arquivos, comentando linha a linha, e a qual você não compreender, não se acanhe em perguntar.

 

login.php

<?php
// Iniciamos a sessão. Todos os arquivos que forem trabalhar com
//     identificação devem carregar esta linha.
session_start();

// Verificamos se a sessão está preenchida. Caso esteja, não há
//     necessidade de login, então redirecionamos para a página
//     de membros.
if(!empty($_SESSION['id'])) header('Location: restrito.php'); ?>

<!-- Formulário HTML para login -->
<form action="session.php?do=login" method="post">
   <fieldset>
       <legend>Login</legend>
       <p><label for="login_user">Usuário</label><input type="text" name="usr" id="login_user"></p>
       <p><label for="login_pass">Senha</label><input type="text" name="pwd" id="login_pass"></p>
       <p><button type="submit">Login</button></p>
   </fieldset>
</form>

 

<?php
// Por questões de segurança, vamos permitir que session.php
//     seja acessada apenas mediante os parâmetros login/logout
//     da variável do. Para isso fazemos 2 verificações:
//     Se a variável existe, e se ela vale ou login, ou logout.
//     Caso alguma verificação falhe, chamamos uma função de
//     erros que será explicada mais adiante.
if(empty($_GET['do']) || !in_array($_GET['do'], array('login','logout'))) do404Err();


// Damos início à sessão.
session_start();

// Verificamos se estamos fazendo um login. Caso afirmativo
//     damos início a um bloco de instruções.
if($_GET['do'] === 'login') {

// Verificamos se a página foi acessada através de um formato
//     de envio de dados POST e se existem as variáveis que
//     necessitamos para fazer o login (usr e pwd). Caso algum
//     requisito falhe, lançamos a função de erros novamente.
   if($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['usr']) || !isset($_POST['pwd'])) do404Err();

// Instanciamos um objeto PDO para controlar o banco de dados.
   $db = new PDO('mysql:hostname=localhost;dbname=imasters', 'root', '');

// Criamos uma instrução preparada para receber valores.
   $stmt = $db->prepare('SELECT `id`, `username`, `password` FROM `members` WHERE `username` = ?');

// Preenchemos os valores, executamos a consulta e verificamos
//     se a consulta falha. Se falhar, exibimos na tela o motivo
//     e paramos a aplicação.
   if(!$stmt->execute($_POST['usr'])) die(array_pop($stmt->errorInfo()));

// Se não falhar, recuperamos os dados do banco e enviamos para
//     a variável $data. $data agora é um array associativo cujas
//     chaves correspondem ao nome dos campos.
   $data = $stmt->fetchAll();

// Caso não hajam linhas em $data, quer dizer que a nossa consulta
//     não encontrou nenhum usuário compatível com o que foi
//     informado. Então dizemos ao usuário que o nome especificado
//     não existe.
   if(!sizeof($data)) die('Usuário não existe.');

// Se o usuário existe, agora é hora de verificar se a senha confere.
//     O algoritmo de geração de senha do exemplo utiliza a função
//     hash() para encriptar a senha, seguida de um 'salt' para dar
//     uma embaralhada na senha e evitar que o hash corresponda a
//     palavras do dicionário. Provavelmente, esta é a linha mais
//     complexa do sistema.
   if($data[0]['password'] !== hash('sha512', $_POST['pwd'] . 'sys123')) die('Senha incorreta.');

// Se a senha validar, criamos dois campos na sessão, um para armazenar
//     o ID do usuário logado, e outro para armazenar seu nome.
   $_SESSION['id'] = $data[0]['id'];
   $_SESSION['member'] = $data[0]['username'];

// Enviamos o usuário para a página de membros.
   header('Location: restrito.php');
}


// Verificamos se a ação é um 'logout'. Caso afirmativo damos início
//     ao bloco de instruções correspondente.
if($_GET['do'] === 'logout') {

// While significa "Enquanto". Então, enquanto existirem chaves dentro
//     da sessão, reduzimos o seu tamanho.
   while(sizeof($_SESSION)) array_pop($_SESSION); // Esvaziando a sessão.

// Após esvaziar a sessão, encerramo-na
   sesson_destroy();

// Enviamos o usuário para a página de login.
   header('Location: login.php');
}

// Esta função tem a simples utilidade de enviar o usuário para a página
//     inicial caso alguma tentativa suspeita seja detectada. Tomamos por
//     tentativa suspeita, toda requisição do arquivo session.php que não
//     seja pelos meios previstos de seu funcionamento.
function do404Err(){
   header('HTTP/1.1 404 Not Found');
   header('Location: ./');
}

 

<?php

// Iniciamos a sessão.
session_start();

// Verificamos se existe um membro registrado na sessão. Se não existir
//     damos início a um bloco, que envia o usuário para a página de login.
if(empty($_SESSION['member'])) {
   header('HTTP/1.1 401 Unauthorized');
   header('Location: login.php');
}

// Se existir, saudamos o usuário e fornecemos um link para que ele possa
//     encerrar a sessão.
echo '<p>Olá, ' . $_SESSION['member'] .', seja bem vindo!</p>
</p><a href="session.php?do=logout" title="Encerrar a sessão">Fazer logout</a></p>';

 

Leitura auxiliar:

http://br2.php.net/manual/en/book.pdo.php

http://br2.php.net/manual/en/pdo.prepare.php

http://br2.php.net/manual/en/pdostatement.execute.php

http://br2.php.net/manual/en/pdostatement.fetchall.php

http://br2.php.net/manual/en/function.hash.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evandro,

Realmente eu não sei o que está acontecendo, não sei se preciso ter uma configuração a mais no meu computador, inclusive ao invés do safari, tentei abrir pelo firefox e deu o mesmo problema que antes, a tela fica branca com a barra de endereço preenchida.

 

Eu havia colocado o nome errado, não era restito.php?do=login e sim session.php?do=login

 

Tem idéia de por que isso acontece? inclusive só alterei o endereço do localhost, do banco de dados e o nome da tabela. Se eu coloco a senha errada para tentar gerar um erro acontece a mesma coisa.

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos adicionar dois comandos para verificar a ocorrência de erros:

 

<?php
// Definimos o nível dos erros processados.
error_reporting(8191);

// Preparamos o código para exibir os erros ao usuários.
ini_set('display_errors', TRUE);

// Por questões de segurança, vamos permitir que session.php
//     seja acessada apenas mediante os parâmetros login/logout
//     da variável do. Para isso fazemos 2 verificações:
//     Se a variável existe, e se ela vale ou login, ou logout.
//     Caso alguma verificação falhe, chamamos uma função de
//     erros que será explicada mais adiante.
if(empty($_GET['do']) || !in_array($_GET['do'], array('login','logout'))) do404Err();

// Damos início à sessão.
session_start();

// Verificamos se estamos fazendo um login. Caso afirmativo
//     damos início a um bloco de instruções.
if($_GET['do'] === 'login') {

// Verificamos se a página foi acessada através de um formato
//     de envio de dados POST e se existem as variáveis que
//     necessitamos para fazer o login (usr e pwd). Caso algum
//     requisito falhe, lançamos a função de erros novamente.
   if($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['usr']) || !isset($_POST['pwd'])) do404Err();

// Iniciamos um bloco de tentativas.
   try {

// Instanciamos um objeto PDO para controlar o banco de dados.
   	$db = new PDO('mysql:hostname=localhost;dbname=imasters', 'root', '');
   }

// Capturamos qualquer exceção enviada.
   catch(Exception $e) {

// Encerramos o programa com a mensagem da exceção.    	
   	die($e->getMessage());
   }

// Forçamos o objeto PDO a exibir erros de consulta.
   $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

// Criamos uma instrução preparada para receber valores.
   $stmt = $db->prepare('SELECT `id`, `username`, `password` FROM `members` WHERE `username` = ?');

// Preenchemos os valores, executamos a consulta e verificamos
//     se a consulta falha. Se falhar, exibimos na tela o motivo
//     e paramos a aplicação.
   if(!$stmt->execute(array($_POST['usr']))) die(array_pop($stmt->errorInfo()));

// Se não falhar, recuperamos os dados do banco e enviamos para
//     a variável $data. $data agora é um array associativo cujas
//     chaves correspondem ao nome dos campos.
   $data = $stmt->fetchAll();

// Caso não hajam linhas em $data, quer dizer que a nossa consulta
//     não encontrou nenhum usuário compatível com o que foi
//     informado. Então dizemos ao usuário que o nome especificado
//     não existe.
   if(!sizeof($data)) die('Usuário não existe.');

// Se o usuário existe, agora é hora de verificar se a senha confere.
//     O algoritmo de geração de senha do exemplo utiliza a função
//     hash() para encriptar a senha, seguida de um 'salt' para dar
//     uma embaralhada na senha e evitar que o hash corresponda a
//     palavras do dicionário. Provavelmente, esta é a linha mais
//     complexa do sistema.
   if($data[0]['password'] !== hash('sha512', $_POST['pwd'] . 'sys123')) die('Senha incorreta.');

// Se a senha validar, criamos dois campos na sessão, um para armazenar
//     o ID do usuário logado, e outro para armazenar seu nome.
   $_SESSION['id'] = $data[0]['id'];
   $_SESSION['member'] = $data[0]['username'];

// Enviamos o usuário para a página de membros.
   header('Location: restrito.php');
}

// Verificamos se a ação é um 'logout'. Caso afirmativo damos início
//     ao bloco de instruções correspondente.
if($_GET['do'] === 'logout') {

// While significa "Enquanto". Então, enquanto existirem chaves dentro
//     da sessão, reduzimos o seu tamanho.
   while(sizeof($_SESSION)) array_pop($_SESSION); // Esvaziando a sessão.

// Após esvaziar a sessão, encerramo-na
   session_destroy();

// Enviamos o usuário para a página de login.
   header('Location: login.php');
}

// Esta função tem a simples utilidade de enviar o usuário para a página
//     inicial caso alguma tentativa suspeita seja detectada. Tomamos por
//     tentativa suspeita, toda requisição do arquivo session.php que não
//     seja pelos meios previstos de seu funcionamento.
function do404Err(){
   header('HTTP/1.1 404 Not Found');
   header('Location: ./');
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Apareceram estes erros

 

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /Applications/MAMP/htdocs/session.php:9) in /Applications/MAMP/htdocs/session.php on line 25

 

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /Applications/MAMP/htdocs/session.php:9) in /Applications/MAMP/htdocs/session.php on line 25

Senha incorreta.

 

 

Leo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifique se você não está dando nenhum <enter> antes de começar o bloco '<?php'

 

Testei o script aqui e funcionou perfeitamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evandro,

Coloquei na primeira linha da montagem do site e funcionou, mas apareceu senha incorreta, e tenho certeza absoluta que a senha está correta.

 

 

Leo

 

Evandro, funcionou, mas tirando o hash, se eu colocar só o $_POST['pwd']

 

pode dar uma verificada na função hash?

 

grato,

Leo

 

Ok Evandro,

Andei dando uma lida e consegui entender o que estava acontecendo, a senha que eu tinha inserido não tinha o sha512, e estava comparando com um query que tinha o sha512 e o sys123.

Tenho que inserir a senha já com a codificação, como faço para dar este comando?

 

Leo

 

Evandro,

Resolvi colocando o sha1 e tirando o sys123, pois não sabia como inserir a senha encriptada com sha512 e o sys123, mas está funcionando, mas uma vez muito obrigado.

 

Leo

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.