quarta-feira, 22 de setembro de 2010

Protegendo Páginas em PHP

Então,
Agora que o Blog não é mais exclusivo JAVA, vou começar com uma aplicação de Login (todos já fizemos), com páginas diferentes para Administrador e Funcionários (nem todos já fiseram), protegidas para que não se possa acessar nenhuma URL além da tela inicial (quase ninguém faz).

------------------------------------------------------------------------------------------
config.php - Serve para configurar a conexão com o banco de dados.
------------------------------------------------------------------------------------------
<?php
$host = "localhost"; //Servidor do mysql
$user = "root"; //Usuario do banco de dados
$senha = ""; //senha do banco de dados
$db = "user"; //banco de dados
$nome_site = "login.php"; //Nome do site
$email = "email@host.com"; //E-mail do administrador
$site = "http://www.meusite.com"; //Seu site n se esuqece de bota o http://

mysql_connect($host, $user, $senha) or die (mysql_error());
mysql_select_db($db) or die (mysql_error());
?>

------------------------------------------------------------------------------------------

login.php - Página Principal
------------------------------------------------------------------------------------------
<!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=iso-8859-1" />
<title>Document sans titre</title>
<style type="text/css">
<!--
.Style6 {font-size: 13px}
-->
</style>
</head>

<body>
<form id="form1" name="form1" method="post" action="../login/logar.php">
  <table width="41%" border="0">
    <tr>
      <td colspan="2"><div align="center"><strong>Usuario</strong></div></td>
    </tr>
    <tr>
      <td><span class="Style6">Login:</span></td>
      <td><span class="Style6">
        <label>
        <input name="login" type="text" id="login" />
        </label>
      </span></td>
    </tr>
    <tr>
      <td><span class="Style6">Senha:</span></td>
      <td><span class="Style6">
        <label>
        <input name="senha" type="password" id="senha" />
        </label>
      </span></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><span class="Style6">
        <label>
        <input type="submit" name="Submit" value="OK" />
        </label>
      </span></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><span class="Style6"><a href="../login/esquece_senha.php">Esquece senha </a></span></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><span class="Style6"><a href="../login/cadastro.php">Cadastro</a></span></td>
    </tr>
  </table>
</form>
</body>
</html>

------------------------------------------------------------------------------------------

logar.php - Página que irá trabalhar os dados do Login
------------------------------------------------------------------------------------------
<?php
require("bloquear.php");
trancar_pagina("logar.php");
?>
<?php
include("config.php");

$login = $_POST['login'];
$senha = $_POST['senha'];

/* Verifica se existe usuario, o segredo ta aqui quando ele procupa uma
linha q contenha o login e a senha digitada */
$sql_logar = "SELECT * FROM user WHERE login = '$login' && senha = '$senha'";
$exe_logar = mysql_query($sql_logar) or die (mysql_error());
$fet_logar = mysql_fetch_assoc($exe_logar);
$num_logar = mysql_num_rows($exe_logar);

//Verifica se n existe uma linha com o login e a senha digitado
if ($num_logar == 0){
   echo "Login ou senha invalido.";
   echo "<br><a href='javascript:window.history.go(-1)'>Clique aqui para volta.</a>";  
}
elseif($fet_logar['activo'] == "N"){
   echo "Usuario não ativado, verifique seu e-mail para ativa a conta.";
   echo "<br><a href='javascript:window.history.go(-1)'>Clique aqui para volta.</a>";
}
else{
   //Cria a sessão e manda pra pagina principal.php
   session_start();
   $_SESSION['login'] = $login;
   $_SESSION['senha'] = $senha;
  
    if ($fet_logar['Tipo'] == "A"){
        header("Location:administrador.php");
    }
    else{
        header("Location:funcionario.php");
    }
}
?>
------------------------------------------------------------------------------------------

Cadastro.php - Cadastro de novo funcionário no banco
------------------------------------------------------------------------------------------
<?php
require("bloquear.php");
trancar_pagina("cadastro.php");
?>
<?php

include("config.php");

if (isset($_POST['login'])){

   //pega a sessão id do usuario
   session_start();
   $sessao = session_id();
   $login = $_POST['login'];
   $senha = $_POST['senha'];
   $nome  = $_POST['nome'];
   $email = $_POST['email'];

   $sql_busca = "SELECT * FROM user WHERE login = '$login'";
   $exe_busca = mysql_query($sql_busca) or die (mysql_error());
   $num_busca = mysql_num_rows($exe_busca);

   $sql_busca2 = "SELECT * FROM user WHERE email = '$email'";
   $exe_busca2 = mysql_query($sql_busca2) or die (mysql_error());
   $num_busca2 = mysql_num_rows($exe_busca2);

   //Verifica se os campos estão preenchidos
   if ($_POST['login'] == "" || $_POST['senha'] == "" || $_POST['senha2'] == "" || $_POST['nome'] == "" || $_POST['email'] == "" || $_POST['Tipo'] == ""){
      $ac[] = "Por favou preencha todos os campos corretamente.";
   }
   //Verifica se ja existe o login
   if ($num_busca > 0){
      $ac[] = "Esse login já esta sendo usado por outro usuario.";
   }
   //Verifica se ja existe o e-mail
   if ($num_busca2 > 0){
      $ac[] = "Esse e-mail já esta sendo usado por outro usuario.";
   }
   //Verifica se o e-mail esta correto
   if (!ereg("@.", $_POST['email'])){
      $ac[] = "E-mail invalido.";
   }
   //Verifica se as duas senha são diferente
   if ($_POST['senha'] != $_POST['senha2']){
      $ac[] = "Verifique se as duas senha estão correta.";
   }
   //Verifica se todas estão corretas
   if (!isset($ac)){
      //Inclui o cadastro no mysql
      $sql_inclu = "INSERT INTO user(login, senha, email, sessao) VALUES
                    ('$login', '$senha', '$email', '$sessao')";
      $exe_inclu = mysql_query($sql_inclu) or die (mysql_error());
        $sql_inclui = "INSERT INTO nome(nome) VALUES('$nome')";
      $exe_inclui = mysql_query($sql_inclui) or die (mysql_error());
     
      $topico = "Cadastro $nome_site";
      $mensagem = "<html>";
      $mensagem .= "<body>";
      $mensagem .= "Olá $login\r\n";
      $mensagem .= "<br>Você efetuou um cadastro no $nome_site.</br>";
      $mensagem .=    "<br>Login: $login";
      $mensagem .=    "<br>Senha: $senha";
      $mensagem .=    "<br>Ativar conta <a href='$site/active.php?ac=$sessao'>$site/active.php?ac=$sessao</a></br>";
      $mensagem .=    "</body>";
      $mensagem .=    "</html>";
      $headers = "MIME-Version: 1.0\r\n";
      $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
      $headers .= "From: $nome_site <$email>\r\n";
      $ac[] = "Cadastro efetuado com sucesso, verifique seu e-mail para ativa a conta.";
      //enviar para o email o login, senha e o codigo de ativação
      mail($email, $topico, $mensagem, $headers);
   }
}
?>
<!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=iso-8859-1" />
<title>Document sans titre</title>
<style type="text/css">
<!--
.Style2 {font-size: 13px}
-->
</style>
</head>
<body>
<?php
if (isset($ac)){
   for($i=0;$i<count($ac);$i++){
      echo "<li>".$ac[$i];
   }
}
?>
<form id="form1" name="form1" method="post" action="<? $_SERVER['file:///C|/DOCUME~1/admin/CONFIG~1/Temp/Rar$DI05.687/PHP_SELF']?>">
  <table width="100%" border="0">
    <tr>
      <td colspan="2"><div align="center"><strong>Cadastro</strong></div></td>
    </tr>
    <tr>
      <td width="13%"><span class="Style2">Login:</span></td>
      <td width="87%"><span class="Style2">
        <label>
        <input name="login" type="text" id="login" />
        </label>
      </span></td>
    </tr>
    <tr>
      <td><span class="Style2">Senha:</span></td>
      <td><span class="Style2">
        <label>
        <input name="senha" type="password" id="senha" />
        </label>
      </span></td>
    </tr>
    <tr>
      <td><span class="Style2">Repetir senha: </span></td>
      <td><span class="Style2">
        <label>
        <input name="senha2" type="password" id="senha2" />
        </label>
      </span></td>
    </tr>
    <tr>
      <td><span class="Style2">Nome: </span></td>
      <td><span class="Style2">
        <label>
        <input name="Nome" type="text" id="nome" />
        </label>
      </span></td>
    </tr>   
    <tr>
      <td><span class="Style2">E-mail:</span></td>
      <td><span class="Style2">
        <label>
        <input name="email" type="text" id="email" />
        </label>
      </span></td>
    </tr>
    <tr>
    <td><span class="Style2">Tipo:</span></td>
      <td><label>
      <input type="radio" name="Tipo" id="af" value="A" />
      Administrador
      <input type="radio" name="Tipo" id="af" value="F" />
      Funcionário</label></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><span class="Style2">
        <label>
        <input type="submit" name="Submit" value="Enviar" />
        </label>
      </span></td>
    </tr>
  </table>
  <p>&nbsp;</p>
</form>
</body>
</html>

------------------------------------------------------------------------------------------

esquece_senha.php - Recuperação de Senha
------------------------------------------------------------------------------------------
<?php
include("config.php");

if (isset($_POST['login'])){
   $login = $_POST['login'];
   //Verifica se existe usuario
   $sql_busca = "SELECT * FROM user WHERE login = '$login'";
   $exe_busca = mysql_query($sql_busca) or die (mysql_error());
   $fet_busca = mysql_fetch_assoc($exe_busca);
   $num_busca = mysql_num_rows($exe_busca);
   //verifica se existe uma linha com o login digitado
   if ($num_busca > 0){
      $email = $fet_busca['email'];
      $senha = $fet_busca['senha'];
      $topico = "Esquece senha";
      $mensagem = "<html>";
      $mensagem .= "<body>";
      $mensagem .= "<br>Você efetuou um pedido de recuperação de senha no $nome_site.</br>";
      $mensagem .=    "<br>Login: $login";
      $mensagem .=    "<br>Senha: $senha</br>";
      $mensagem .= "<br>Site oficial do $nome_site";
      $mensagem .=    "<br><a href='$site'>$site</a></br>";
      $mensagem .=    "</body>";
      $mensagem .=    "</html>";
      $headers = "MIME-Version: 1.0\r\n";
      $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
      $headers .= "From: $nome_site <$email>\r\n";
     
      //enviar para o email o login e a senha
      mail($email, $topico, $mensagem, $headers);
      $ac[] = "Sua senha foi enviado para seu e-mail.";
   }
   else {
      $ac[] = "Esse login não existe.";
   }
}
?>
<!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=iso-8859-1" />
<title>Document sans titre</title>
<style type="text/css">
<!--
.Style2 {font-size: 13px}
-->
</style>
</head>

<body>
<?php
if (isset($ac)){
   for($i=0;$i<count($ac);$i++){
      echo "<li>".$ac[$i];
   }
}
?>
<form id="form1" name="form1" method="post" action="<? $_SERVER['file:///C|/DOCUME~1/admin/CONFIG~1/Temp/Rar$DI57.031/PHP_SELF']?>">
  <table width="33%" border="0">
    <tr>
      <td colspan="2"><div align="center"><strong>Esquece senha </strong></div></td>
    </tr>
    <tr>
      <td width="22%"><span class="Style2">Login:</span></td>
      <td width="78%"><span class="Style2">
        <label>
        <input name="login" type="text" id="login" />
        </label>
      </span></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><span class="Style2">
        <label>
        <input type="submit" name="Submit" value="Enviar" />
        </label>
      </span></td>
    </tr>
  </table>
</form>
</body>
</html>

------------------------------------------------------------------------------------------

restrito.php - faz a sessão ser restrita a usuários
------------------------------------------------------------------------------------------
<?php
@session_start();
if (isset($_SESSION['login']) && isset($_SESSION['senha'])){
   $login_usuario = $_SESSION['login'];
}
else {
   header("Location:login.php");
   exit();
}
?>

------------------------------------------------------------------------------------------

bloquear.php - Impede que seja acessada qualquer URL diretamente.
------------------------------------------------------------------------------------------
<?php
function trancar_pagina($nome){
    if (eregi("$nome", $_SERVER['SCRIPT_NAME'])){
        header("Location:login.php");
    }
}
?>
------------------------------------------------------------------------------------------

administrador.php - Trata os direitos do Administrador
------------------------------------------------------------------------------------------
<?php
require("bloquear.php");
trancar_pagina("administrador.php");
?>
<?php
include('config.php');

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  mysql_select_db($db);
  $login = $_POST['login'];
  $v2      = $_POST['email'];
  $v3      = $_POST['radio1'];
  $v4      = $_POST['Pontos'];
  
  $updateSQL = "UPDATE user SET email='$v2', activo='$v3', Pontos='$v4' WHERE login = '$login'";

  $Result1 = mysql_query($updateSQL) or die(mysql_error());
 
  echo "Dados alterados com sucesso! <br>";
}

mysql_select_db($db);
$query_manu1 = "SELECT * FROM user";
$manu1 = mysql_query($query_manu1) or die(mysql_error());
$row_manu1 = mysql_fetch_assoc($manu1);
$totalRows_manu1 = mysql_num_rows($manu1);
?>

<!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>Untitled Document</title>
</head>

<body>

Olá <?php
include("config.php");
include("restrito.php");

$sql_busca = "SELECT * FROM user WHERE login = '$login_usuario'";
$exe_busca = mysql_query($sql_busca) or die (mysql_error());
$fet_busca = mysql_fetch_assoc($exe_busca);
$qtd_registros = mysql_num_rows($exe_busca); // retorna a quantidade registros encontrados na consulta acima
$nome = array();

 for($i=0;$i<$qtd_registros;$i++)
{
     $nome[$i] = mysql_result($exe_busca,$i,"login"); // a função mysql_result tem 3 parâmetros: 1º aponta para a variável da consulta; 2º aponta para a linha do registro que você quer pegar; 3º aponta para a coluna que você quer pegar na tabela
    echo $nome[$i]."<br>";   
}
?>
<br>
Você Possui  <?php
include("config.php");
include("restrito.php");

$sql_busca = "SELECT * FROM user WHERE login = '$login_usuario'";
$exe_busca = mysql_query($sql_busca) or die (mysql_error());
$fet_busca = mysql_fetch_assoc($exe_busca);
$qtd_registros = mysql_num_rows($exe_busca); // retorna a quantidade registros encontrados na consulta acima
$nome = array();

 for($i=0;$i<$qtd_registros;$i++)
{
     $nome[$i] = mysql_result($exe_busca,$i,"pontos"); // a função mysql_result tem 3 parâmetros: 1º aponta para a variável da consulta; 2º aponta para a linha do registro que você quer pegar; 3º aponta para a coluna que você quer pegar na tabela
    echo $nome[$i]." pontos! <br>";   
}
?> 
<br>
Alteração de Pontos:
<br><br>

<form action="<?php echo $editFormAction; ?>" method="post" name="form1" id="form1">
  <table>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Login:</td>
      <td><select name="login">
        <?php
do { 
?>
        <option value="<?php echo $row_manu1['login']?>" ><?php echo $row_manu1['login']?></option>
        <?php
} while ($row_manu1 = mysql_fetch_assoc($manu1));
?>
  </select></td>
    </tr>
    <tr> </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Email:</td>
      <td><input type="text" name="email" value="" size="32" /></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Activo:</td>
      <td><label>
      <input type="radio" name="radio1" id="sn" value="S" />
      Sim
      <input type="radio" name="radio1" id="sn" value="N" />
      Não</label></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Novos Pontos:</td>
      <td><input type="text" name="Pontos" value="" size="32" /></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Tipo:</td>
      <td><label>
      <input type="radio" name="radio2" id="af" value="A" />
      Administrador
      <input type="radio" name="radio2" id="af" value="F" />
      Funcionário</label></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">&nbsp;</td>
      <td><input type="submit" value="Alterar" /></td>
    </tr>
  </table>
  <input type="hidden" name="MM_insert" value="form1" />
</form>
<br><br>
  <table width="41%" border="0">
    <tr>
      <td>&nbsp;</td>
      <td><span class="Style6"><a href="../login/login.php">Sair </a></span></td>
    </tr>
  </table>

<p>&nbsp;</p>
</body>
</html>
<?php
mysql_free_result($manu1);
?> 
------------------------------------------------------------------------------------------

funcionario.php - Trata os direitos dos Funcionarios
------------------------------------------------------------------------------------------
<!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>Untitled Document</title>
</head>

<body>

<?php
require("bloquear.php");
trancar_pagina("funcionario.php");
?>


Olá <?php
include("config.php");
include("restrito.php");

$sql_busca = "SELECT * FROM user WHERE login = '$login_usuario'";
$exe_busca = mysql_query($sql_busca) or die (mysql_error());
$fet_busca = mysql_fetch_assoc($exe_busca);
$qtd_registros = mysql_num_rows($exe_busca); // retorna a quantidade registros encontrados na consulta acima
$nome = array();

 for($i=0;$i<$qtd_registros;$i++)
{
     $nome[$i] = mysql_result($exe_busca,$i,"login");
/*     a função mysql_result tem 3 parâmetros:
        1º aponta para a variável da consulta;
     2º aponta para a linha do registro que você quer pegar;
     3º aponta para a coluna que você quer pegar na tabela */
    echo $nome[$i]."<br>";   
}
?>
<br>
Você Possui  <?php
include("config.php");
include("restrito.php");

$sql_busca = "SELECT * FROM user WHERE login = '$login_usuario'";
$exe_busca = mysql_query($sql_busca) or die (mysql_error());
$fet_busca = mysql_fetch_assoc($exe_busca);
$qtd_registros = mysql_num_rows($exe_busca); // retorna a quantidade registros encontrados na consulta acima
$nome = array();

 for($i=0;$i<$qtd_registros;$i++)
{
     $nome[$i] = mysql_result($exe_busca,$i,"pontos"); // a função mysql_result tem 3 parâmetros: 1º aponta para a variável da consulta; 2º aponta para a linha do registro que você quer pegar; 3º aponta para a coluna que você quer pegar na tabela
    echo $nome[$i]." pontos! <br><br>";   
}

?>
  <table width="41%" border="0">
    <tr>
      <td>&nbsp;</td>
      <td><span class="Style6"><a href="../login/login.php">Sair </a></span></td>
    </tr>
  </table>
</body>
</html>

Um comentário:

  1. Valeu pela dica.
    Não precisei de todo o tutorial, mas encontrei o que precisava, que era restringir o acesso as páginas.

    ResponderExcluir