PI S5 DSW II DouglasARS: mudanças entre as edições

De IFSC
Ir para navegação Ir para pesquisar
imported>Douglas
Sem resumo de edição
imported>Douglas
Sem resumo de edição
Linha 733: Linha 733:
</pre>
</pre>


<h2>Identifique-se</h2></center>
<b>Identifique-se</b></center>
<form action="valida.php" method="POST" id="formLogin">
<form action="valida.php" method="POST" id="formLogin">
<label for="login">Usuário</label>
<label for="login">Usuário</label>

Edição das 17h32min de 10 de março de 2016

Apresentação

Olá Desenvolvedores,

Nessa quinta semana vamos levantar alguns questionamentos relatados a partir da correção da AO1. Ainda, apresentar novas formas de programação de formulário e organização dos arquivos (código fonte, css, imagens) no ambiente de desenvolvimento. Precisamos ajustar nossa modelagem do banco de dados para continuarmos com o desenvolvimento dos formulário e consultas e rever o acesso ao banco de dados com um pouco de segurança. Vou postar nessa quinta semana na wiki da unidade, os códigos fontes para a criação de formulários personalizados com uso de CSS. Assistam as vídeo aulas das semanas anteriores e repitam os exemplos. Isso pode ser feito já utilizando as tabelas do sistema que vocês escolheram.

Boa programação a todos!


Prof. Douglas A.

Objetivo

  1. Apresentar as considerações sobre a modelagem do banco de dados feita na AO1.
  2. Mostrar detalhes da programação de formulários quanto ao cadastro e consulta aos dados.


Segurança

Qualquer sistema requer o mínimo de segurança. Outras unidades curriculares vão abordar mais particularmente a questão de segurança. Nas semanas anteriores foram apresentados vídeos mostrando como fazer telas de login e senha de usuário, para acessar o sistema. Ficaram algumas dúvidas e com a ajuda do nosso colega Kleber (Joinville) podemos ter uma ideia um pouco mais avançada para o tema e, ao mesmo tempo, resolvemos alguns problemas de acesso, acrescentamos um pouco mais de segurança ao nosso sistema. Abaixo ele explica o que fazer:

por KLEBER PEREIRA DE ALMEIDA - Sunday, 6 de March de 2016, 21:25

Caso alguém esteja enfrentando problemas em realizar o login utilizando os scripts disponibilizados pelo professor (login.php, seguranca.php e valida.php), vão as dicas... No arquivo "seguranca.php" altere os dados do servidor, usuário, senha e banco de acordo com seu projeto, eu alterei meu case sensitive para true (opcional). Verifique se seu projeto já não possui uma tabela "usuarios", provavelmente sim, recomendo alterar o script de seu projeto no Workbench de maneira a tabela "usuarios" ficar igual a do script fornecido pelo professor. Depois basta inserir os dados na tabela, afinal, precisamos de no mínimo um usuário cadastrado para autenticarmos. É preciso também um mínimo de segurança nas informações prestadas pelo usuário, então insira a senha utilizando criptografia/ hash ex.:

INSERT INTO usuarios (nome, usuario, senha)
VALUES ('Kleber Pereira de Almeida', 'kleber', MD5('teste'));

Não esqueça que a comparação da senha também deverá ser criptografada, ou seja na linha 9 do arquivo "valida.php" altere para:

$senha = isset($_POST['senha']) ? MD5($_POST['senha']) : '';

Espero ter ajudado, caso alguém tenha encontrado estas pequenas barreiras no caminho.

Obrigado Kleber.

Aluguel de Carros

Consideração 1

Uma das tabelas do sistema Aluguel de Carros e a Costumer que traduzindo é Cliente. Abaixo, segue um exemplo de modelagem complicada por vários fatores que relaciono abaixo. Mostro também um exemplo de como poderia ser modelada essa mesma tabela.

CREATE TABLE IF NOT EXISTS `mydb`.`Cliente` (
`idCliente` INT NOT NULL,
`Nome do Cliente` VARCHAR(45) NULL,
`Descrição do Cliente` VARCHAR(45) NULL,
`Sexo` VARCHAR(45) NULL,
`endereço de e-mail` VARCHAR(45) NULL,
`Número telefone` VARCHAR(45) NULL,
`Endereço Residencial` VARCHAR(45) NULL,
`Endereço Comercial` VARCHAR(45) NULL,
`Endereço Corespondência` VARCHAR(45) NULL,
`Cidade` VARCHAR(45) NULL,
`Estado` VARCHAR(45) NULL,
`País` VARCHAR(45) NULL,
PRIMARY KEY (`idCliente`))

Primeira observação:

Nome (espaço) do (espaço) Cliente


Embora o MySQL deixe criar, isto pode causar grandes programas no desenvolvimento e erros de codificação . Sugiro que vocês revejam os modelos no Workbench ou no DBDesigner com os nomes de campos sem espaço, sem cedilha, sem acentos, sem caracteres especiais como $, &, %.

Segunda observação:

Também parece que não houve muita preocupação com os tamanhos dos campos. Está tudo com 45 caracteres. Acontece que na maioria dos casos é suficiente para abrigar um nome de pessoa ou mesmo um endereço, mas sempre deve-se pensar no pior caso, pra não precisa ficar dando manutenção no sistema/banco de dados e alterando o tamanho do campo na respectiva tabela no banco de dados. Outro problema, se as reservas vão ser em hotéis do Brasil, tem que ver se o tamanho de 45 para o estado do cliente não é grande demais. Não que isso vá alterar qualquer coisa no sistema, mas também me parece, que está exagerado. Mas isso vai de cada um desenvolvedor/programador.


Exemplos para o campo "Nome de Cliente":

nome_do_cliente varchar(100) not null,

nm_cliente varchar(100) not null,

nomeCliente varchar(100) not null,

nome varchar(100) not null,

Deve ser not null porque necessariamente um cliente deve ter um nome.


Não é recomendado que se use acentuação. Outros servidores de outros países podem não estar preparados para a codificação com acentuação e outros caracteres especiais, entre outros problemas, então, por exemplo, mostro como poderia ser criada essa mesma tabela Cliente a partir do modelo da tabela Costumer do modelo conceitual (inicial) do sistema Aluguel de Carros:


CREATE TABLE IF NOT EXISTS `mydb`.`Cliente` (
`id_cliente` INT NOT NULL,
`nome_cliente` VARCHAR(100) NOT NULL,
`obs_cliente` VARCHAR(100) NULL,
`sexo` CHAR(1) NULL,
`email` VARCHAR(100) NULL,
`telefone` VARCHAR(20) NULL,
`endereco` VARCHAR(100) NULL,
`cidade` VARCHAR(50) NULL,
`uf` VARCHAR(2) NULL,
`pais` VARCHAR(50) NULL,
PRIMARY KEY (`id_cliente`))


Embora o modelo original tenha aberto espaço de 3 linhas para o endereço, trata-se do mesmo endereço. Se fosse endereços diferentes, teria que ter, necessariamente: 3 cidades, 3 estados e até 3 países.

Prof. Douglas A.

Consideração 2

O campo engine_size da tabela Vehicle (no modelo conceitual) teve seu campo traduzido para tamanho_motor da tabela Veiculo. Para quem não questionou tal tradução, bem como outras, este campo poderia ser potencia_motor ou mesmo cilindrada. Tomem cuidado com os tamanhos de campos e vejam se todos os campos vão receber "aqueles" tipos de dados que vocês estão imaginando. Claro que muita coisa só vai ser percebida quando começarem a programar os formulários de entrada e consultas. Nos primeiros testes vocês vão perceber que um ou outro campo precisa ser de tamanho ou tipo diferente ou mesmo com um outro nome. Daí se faz a manutenção no banco de dados e também devemos atualizar o modelo.

Prof. Douglas A.

Consideração 3

Fiquei preocupado com uma coisa que vai dar trabalho pra vocês. Em algumas modelagens que eu vi até agora, alguns campos das tabelas iniciaram com maiúsculas enquanto que outros campos com letras minúsculas e tem ainda os campos com a mistura das duas formas. Dependendo a forma que vocês vão programar, pode dar problema de não reconhecer o nome campo (case sensitive) . Outra coisa que pode acontecer e a demora na programação. Se vocês esquecerem como cada campo foi escrito, vocês vão ter que toda hora recorrer a modelagem para tirar dúvida. Sugiro que vocês adotem um padrão para todos os campos.


Prof. Douglas A.

Reservas de Hotéis

Esse sistema é relativamente maior, com bastante coisa pra programar, mas vale a pena as equipes tentarem ir até o final.

Numa das correções, eu observei que a tabela original Room_Rate_Periods (tarifa_quarto_periodo) ficou com informações que parecem campos, mas na verdade são só exemplos do que deve conter o campo descricao_tarifa_periodo. Portanto, no novo modelo relacional e no físico (banco de dados) esses "campos" da tabela não devem ser criados.

CREATE TABLE IF NOT EXISTS `Reseva_Hotel_Jorge`.`tarifa_quarto_periodo` (
`idtarifa_quarto_periodo` INT(11) NOT NULL,
`codigo_tarifa__periodo` INT(11) NOT NULL,
`descricao_tarifa_periodo` VARCHAR(255) NOT NULL,
`ex Jan ate Mar` INT(11) NOT NULL,
`ex Set ate Dez` INT(11) NOT NULL,
`tarifa_periodo_tipos_quarto_idtipos_quarto` INT(11) NOT NULL,
PRIMARY KEY (`idtarifa_quarto_periodo`))

Os campos abaixo são só exemplo do que o usuário do sistema tem escrever nesse campo:

`ex Jan ate Mar` INT(11) NOT NULL,
`ex Set ate Dez` INT(11) NOT NULL,

Nos dois exemplos, o código da tarifa é válida entre Janeiro a Março ou Setembro a Dezembro.

Aqui no Brasil podia ter haver com o período de férias de verão, de inverno ou alta temporada e baixa temporada.

Até mais.

Prof. Douglas A.

Programação de Formulários

Vamos programar!

Nas outras semanas eu já venho postando vídeos de como criar os formulários para a cadastro das informações no sistema. Nessa semana, vamos retornar ao assunto e mostrar como fica o acesso ao banco de dados e também uma tabela de usuários que vão utilizar o sistema. Na Figura 1 eu mostro como fica a organização dos códigos fonte (PHP, CSS, HTML) no meu sistema operacional Ubuntu 14. Ocorre que isso pode mudar para versões mais antigas e no windows também. Porém, é muito parecido, sendo que a pasta base indicada pela instalação do Apache vai ser www ou www/html que é o caso deste exemplo.

Arvore sistema.png

Figura 1 - Organização do código fonte nas pastas do Ubuntu.


Percebam que foi utilizada a pasta exemplo para colocar os códigos do sistema. E que está localizada no caminho: /var/www/html/exemplo.

Logo, quando for solicitado http://localhost/exemplo/ através do navegador, o servidor Apache direciona para a pasta exemplo onde está o sistema, e procura pelo arquivo index.html, se não encontrar, procura por index.php e assim por diante. Como existe esse arquivo na pasta exemplo e responde com a tela de ligin do meu sistema que é apresentada na Figura 2.

Tela login sistema.png

Figura 2 - Tela de login do Sistema Exemplo.


Passo a passo

Este passo a passo tem por objetivo criar uma tela de login como a mostrada na Figura 2.

Criar a tabela usuarios

Para criar a tabela usuarios, você precisa executar o script SQL abaixo na aba SQL do phpmyadmin.

CREATE TABLE IF NOT EXISTS `usuarios` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(100) NOT NULL,
  `usuario` varchar(50) NOT NULL,
  `senha` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `usuario` (`usuario`)
) 

Cadastrando primeiro usuário

É necessário que você tenha pelo menos um usuário inicialmente cadastrado. Preferimos cadastrar a senha com criptografia (MD5). Abaixo apresentamos o código para inserir pelo menos um usuário inicial no nosso sistema (aba SQL do phpmyadmin). A Figura 3 mostra como ficaram os dados da tabela depois executar os scripts SQL.

INSERT INTO `usuarios` (`nome`, `usuario`, `senha`) VALUES
('Administrador do Sistema', 'adm', MD5('teste'));

Logo:

nome: Administrador do Sistema
usuario: adm
senha: teste (criptografia MD5)
Tela phpmyadmin senha md5.png

Figura 3 - Tela do phpMyAdmin mostrando o conteúdo da tabela usuarios.

Notem que existem dois usuários cadastrados como exemplo. Percebam que as senha não tem nada haver com 1234 do usuário douglas e teste do usuário adm.

Criar os arquivos

Precisamos criar os arquivos como descrito em outros tutoriais. Como a página faz uso de CSS é importante colocar no pasta o arquivo contendo o CSS. Neste exemplo criei uma pasta chamada estilos dentro da pasta exemplo que você pode ver na Figura 1. Abaixo segue o nome do arquivo a ser criado na pasta exemplo (meu caso) e seus respectivos códigos.

index.php
<?php
include("seguranca.php"); // Inclui o arquivo com o sistema de segurança
protegePagina(); // Chama a função que protege a página
echo "Olá, " . $_SESSION['usuarioNome'];
?>
login.php
<html>
<head>
<title>Cadastro de Clientes </title>
<meta name="author" content="Douglas ARS">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta http-equiv="content-language" content="Portugues">
    <link rel="stylesheet" href="estilos/estilos.css" type="text/css" />
</head>
<body>
<div id="topo" style="position:relative; margin:0 0 30px 0;"> 
        <div id="topo-imagem" style="float: left;"> 
        Cadastro de Clientes        </div> 
</div>
<div id="corpo-interno">
    <div id="sair">
            Usuário: <strong>
            Não identificado</strong> </div>
    
<center><b>Identifique-se<b></center>
<form action="valida.php" method="POST" id="formLogin">
	<label for="login">Usuário</label>
	<input type="text" name="usuario"> <br />
	<label for="senha">   Senha</label>
	<input type="password" name="senha"> <br />
	<input type="submit" value="Entrar" />
</form>

<br />
</div>
</body>
</html>
seguranca.php
<?php
/**
* Sistema de segurança com acesso restrito
*
* Usado para restringir o acesso de certas páginas do seu site
*
* @author Thiago Belem <contato@thiagobelem.net>
* @link http://thiagobelem.net/
*
* @version 1.0
* @package SistemaSeguranca
*/
//  Configurações do Script
// ==============================
$_SG['conectaServidor'] = true;    // Abre uma conexão com o servidor MySQL?
$_SG['abreSessao'] = true;         // Inicia a sessão com um session_start()?
$_SG['caseSensitive'] = false;     // Usar case-sensitive? Onde 'thiago' é diferente de 'THIAGO'
$_SG['validaSempre'] = true;       // Deseja validar o usuário e a senha a cada carregamento de página?
// Evita que, ao mudar os dados do usuário no banco de dado o mesmo contiue logado.
$_SG['servidor'] = 'localhost';    // Servidor MySQL
$_SG['usuario'] = 'root';          // Usuário MySQL
$_SG['senha'] = 'Dougl4S';                // Senha MySQL
$_SG['banco'] = 'mydb';            // Banco de dados MySQL
$_SG['paginaLogin'] = 'login.php'; // Página de login
$_SG['tabela'] = 'usuarios';       // Nome da tabela onde os usuários são salvos
// ==============================
// ======================================
//   ~ Não edite a partir deste ponto ~
// ======================================
// Verifica se precisa fazer a conexão com o MySQL
if ($_SG['conectaServidor'] == true) {
  $_SG['link'] = mysql_connect($_SG['servidor'], $_SG['usuario'], $_SG['senha']) or die("MySQL: Não foi possível conectar-se ao servidor [".$_SG['servidor']."].");
  mysql_select_db($_SG['banco'], $_SG['link']) or die("MySQL: Não foi possível conectar-se ao banco de dados [".$_SG['banco']."].");
}
// Verifica se precisa iniciar a sessão
if ($_SG['abreSessao'] == true)
  session_start();
/**
* Função que valida um usuário e senha
*
* @param string $usuario - O usuário a ser validado
* @param string $senha - A senha a ser validada
*
* @return bool - Se o usuário foi validado ou não (true/false)
*/
function validaUsuario($usuario, $senha) {
  global $_SG;
  $cS = ($_SG['caseSensitive']) ? 'BINARY' : '';
  // Usa a função addslashes para escapar as aspas
  $nusuario = addslashes($usuario);
  $nsenha = addslashes($senha);
  // Monta uma consulta SQL (query) para procurar um usuário
  $sql = "SELECT `id`, `nome` FROM `".$_SG['tabela']."` WHERE ".$cS." `usuario` = '".$nusuario."' AND ".$cS." `senha` = '".$nsenha."' LIMIT 1";
  $query = mysql_query($sql);
  $resultado = mysql_fetch_assoc($query);
  // Verifica se encontrou algum registro
  if (empty($resultado)) {
    // Nenhum registro foi encontrado => o usuário é inválido
    return false;
  } else {
    // Definimos dois valores na sessão com os dados do usuário
    $_SESSION['usuarioID'] = $resultado['id']; // Pega o valor da coluna 'id do registro encontrado no MySQL
    $_SESSION['usuarioNome'] = $resultado['nome']; // Pega o valor da coluna 'nome' do registro encontrado no MySQL
    // Verifica a opção se sempre validar o login
    if ($_SG['validaSempre'] == true) {
      // Definimos dois valores na sessão com os dados do login
      $_SESSION['usuarioLogin'] = $usuario;
      $_SESSION['usuarioSenha'] = $senha;
    }
    return true;
  }
}
/**
* Função que protege uma página
*/
function protegePagina() {
  global $_SG;
  if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
    // Não há usuário logado, manda pra página de login
    expulsaVisitante();
  } else if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
    // Há usuário logado, verifica se precisa validar o login novamente
    if ($_SG['validaSempre'] == true) {
      // Verifica se os dados salvos na sessão batem com os dados do banco de dados
      if (!validaUsuario($_SESSION['usuarioLogin'], $_SESSION['usuarioSenha'])) {
        // Os dados não batem, manda pra tela de login
        expulsaVisitante();
      }
    }
  }
}
/**
* Função para expulsar um visitante
*/
function expulsaVisitante() {
  global $_SG;
  // Remove as variáveis da sessão (caso elas existam)
  unset($_SESSION['usuarioID'], $_SESSION['usuarioNome'], $_SESSION['usuarioLogin'], $_SESSION['usuarioSenha']);
  // Manda pra tela de login
  header("Location: ".$_SG['paginaLogin']);
}
/estilos/estilos.css
* { font-family: Tahoma, "DejaVu Sans"; font-size: .97em }

#topo {
	position: fixed;
	background-image: url('../imagens/topo-repeticao.png');
	background-repeat: repeat-x;
	height: 60px;
	width:100%;
	top:0;
	z-index: 9999;
}
#topo-imagem {
	background-image: url('../imagens/topo.png');
	background-repeat: no-repeat;
	height: 60px;
	padding-left: 130px;
	padding-top: 30px;
	font-size: 22px;
	color:white;
	overflow: hidden;
	text-shadow: black 0.1em 0.1em 0.2em
}
#corpo-interno {
    overflow: auto;
    padding: 5px 2%;
    margin: 0;
}
#formLogin { 
	margin:	auto;
	padding:20px;
	border:solid 1px #ddd;
	width:340px;
	text-align:center;
}
#sair { 
	position:absolute;
	top:65px;
	right:10px;
	/*font-size: 1em; */
	text-align:right;
}
label { 
	font-weight:bold; /* border-bottom: solid 1px #000; */ 
}
input, select, textarea { margin-bottom: 10px; }

input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill {
    background-color: rgb(250, 255, 189);
    background-image: none;
    color: rgb(0, 0, 0);
}
user agent stylesheet
input[type="password" i] {
    -webkit-text-security: disc;
}

Identifique-se

<form action="valida.php" method="POST" id="formLogin"> <label for="login">Usuário</label> <input type="text" name="usuario">
<label for="senha">   Senha</label> <input type="password" name="senha">
<input type="submit" value="Entrar" /> </form>


</body> </html>

seguranca.php
<?php
/**
* Sistema de segurança com acesso restrito
*
* Usado para restringir o acesso de certas páginas do seu site
*
* @author Thiago Belem <contato@thiagobelem.net>
* @link http://thiagobelem.net/
*
* @version 1.0
* @package SistemaSeguranca
*/
//  Configurações do Script
// ==============================
$_SG['conectaServidor'] = true;    // Abre uma conexão com o servidor MySQL?
$_SG['abreSessao'] = true;         // Inicia a sessão com um session_start()?
$_SG['caseSensitive'] = false;     // Usar case-sensitive? Onde 'thiago' é diferente de 'THIAGO'
$_SG['validaSempre'] = true;       // Deseja validar o usuário e a senha a cada carregamento de página?
// Evita que, ao mudar os dados do usuário no banco de dado o mesmo contiue logado.
$_SG['servidor'] = 'localhost';    // Servidor MySQL
$_SG['usuario'] = 'root';          // Usuário MySQL
$_SG['senha'] = 'Dougl4S';                // Senha MySQL
$_SG['banco'] = 'mydb';            // Banco de dados MySQL
$_SG['paginaLogin'] = 'login.php'; // Página de login
$_SG['tabela'] = 'usuarios';       // Nome da tabela onde os usuários são salvos
// ==============================
// ======================================
//   ~ Não edite a partir deste ponto ~
// ======================================
// Verifica se precisa fazer a conexão com o MySQL
if ($_SG['conectaServidor'] == true) {
  $_SG['link'] = mysql_connect($_SG['servidor'], $_SG['usuario'], $_SG['senha']) or die("MySQL: Não foi possível conectar-se ao servidor [".$_SG['servidor']."].");
  mysql_select_db($_SG['banco'], $_SG['link']) or die("MySQL: Não foi possível conectar-se ao banco de dados [".$_SG['banco']."].");
}
// Verifica se precisa iniciar a sessão
if ($_SG['abreSessao'] == true)
  session_start();
/**
* Função que valida um usuário e senha
*
* @param string $usuario - O usuário a ser validado
* @param string $senha - A senha a ser validada
*
* @return bool - Se o usuário foi validado ou não (true/false)
*/
function validaUsuario($usuario, $senha) {
  global $_SG;
  $cS = ($_SG['caseSensitive']) ? 'BINARY' : '';
  // Usa a função addslashes para escapar as aspas
  $nusuario = addslashes($usuario);
  $nsenha = addslashes($senha);
  // Monta uma consulta SQL (query) para procurar um usuário
  $sql = "SELECT `id`, `nome` FROM `".$_SG['tabela']."` WHERE ".$cS." `usuario` = '".$nusuario."' AND ".$cS." `senha` = '".$nsenha."' LIMIT 1";
  $query = mysql_query($sql);
  $resultado = mysql_fetch_assoc($query);
  // Verifica se encontrou algum registro
  if (empty($resultado)) {
    // Nenhum registro foi encontrado => o usuário é inválido
    return false;
  } else {
    // Definimos dois valores na sessão com os dados do usuário
    $_SESSION['usuarioID'] = $resultado['id']; // Pega o valor da coluna 'id do registro encontrado no MySQL
    $_SESSION['usuarioNome'] = $resultado['nome']; // Pega o valor da coluna 'nome' do registro encontrado no MySQL
    // Verifica a opção se sempre validar o login
    if ($_SG['validaSempre'] == true) {
      // Definimos dois valores na sessão com os dados do login
      $_SESSION['usuarioLogin'] = $usuario;
      $_SESSION['usuarioSenha'] = $senha;
    }
    return true;
  }
}
/**
* Função que protege uma página
*/
function protegePagina() {
  global $_SG;
  if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
    // Não há usuário logado, manda pra página de login
    expulsaVisitante();
  } else if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
    // Há usuário logado, verifica se precisa validar o login novamente
    if ($_SG['validaSempre'] == true) {
      // Verifica se os dados salvos na sessão batem com os dados do banco de dados
      if (!validaUsuario($_SESSION['usuarioLogin'], $_SESSION['usuarioSenha'])) {
        // Os dados não batem, manda pra tela de login
        expulsaVisitante();
      }
    }
  }
}
/**
* Função para expulsar um visitante
*/
function expulsaVisitante() {
  global $_SG;
  // Remove as variáveis da sessão (caso elas existam)
  unset($_SESSION['usuarioID'], $_SESSION['usuarioNome'], $_SESSION['usuarioLogin'], $_SESSION['usuarioSenha']);
  // Manda pra tela de login
  header("Location: ".$_SG['paginaLogin']);
}
/estilos/estilos.css
* { font-family: Tahoma, "DejaVu Sans"; font-size: .97em }

#topo {
	position: fixed;
	background-image: url('../imagens/topo-repeticao.png');
	background-repeat: repeat-x;
	height: 60px;
	width:100%;
	top:0;
	z-index: 9999;
}
#topo-imagem {
	background-image: url('../imagens/topo.png');
	background-repeat: no-repeat;
	height: 60px;
	padding-left: 130px;
	padding-top: 30px;
	font-size: 22px;
	color:white;
	overflow: hidden;
	text-shadow: black 0.1em 0.1em 0.2em
}
#corpo-interno {
    overflow: auto;
    padding: 5px 2%;
    margin: 0;
}
#formLogin { 
	margin:	auto;
	padding:20px;
	border:solid 1px #ddd;
	width:340px;
	text-align:center;
}
#sair { 
	position:absolute;
	top:65px;
	right:10px;
	/*font-size: 1em; */
	text-align:right;
}
label { 
	font-weight:bold; /* border-bottom: solid 1px #000; */ 
}
input, select, textarea { margin-bottom: 10px; }

input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill {
    background-color: rgb(250, 255, 189);
    background-image: none;
    color: rgb(0, 0, 0);
}
user agent stylesheet
input[type="password" i] {
    -webkit-text-security: disc;
}

Identifique-se

<form action="valida.php" method="POST" id="formLogin"> <label for="login">Usuário</label> <input type="text" name="usuario">
<label for="senha">   Senha</label> <input type="password" name="senha">
<input type="submit" value="Entrar" /> </form>


</body> </html>

seguranca.php
<?php
/**
* Sistema de segurança com acesso restrito
*
* Usado para restringir o acesso de certas páginas do seu site
*
* @author Thiago Belem <contato@thiagobelem.net>
* @link http://thiagobelem.net/
*
* @version 1.0
* @package SistemaSeguranca
*/
//  Configurações do Script
// ==============================
$_SG['conectaServidor'] = true;    // Abre uma conexão com o servidor MySQL?
$_SG['abreSessao'] = true;         // Inicia a sessão com um session_start()?
$_SG['caseSensitive'] = false;     // Usar case-sensitive? Onde 'thiago' é diferente de 'THIAGO'
$_SG['validaSempre'] = true;       // Deseja validar o usuário e a senha a cada carregamento de página?
// Evita que, ao mudar os dados do usuário no banco de dado o mesmo contiue logado.
$_SG['servidor'] = 'localhost';    // Servidor MySQL
$_SG['usuario'] = 'root';          // Usuário MySQL
$_SG['senha'] = 'Dougl4S';                // Senha MySQL
$_SG['banco'] = 'mydb';            // Banco de dados MySQL
$_SG['paginaLogin'] = 'login.php'; // Página de login
$_SG['tabela'] = 'usuarios';       // Nome da tabela onde os usuários são salvos
// ==============================
// ======================================
//   ~ Não edite a partir deste ponto ~
// ======================================
// Verifica se precisa fazer a conexão com o MySQL
if ($_SG['conectaServidor'] == true) {
  $_SG['link'] = mysql_connect($_SG['servidor'], $_SG['usuario'], $_SG['senha']) or die("MySQL: Não foi possível conectar-se ao servidor [".$_SG['servidor']."].");
  mysql_select_db($_SG['banco'], $_SG['link']) or die("MySQL: Não foi possível conectar-se ao banco de dados [".$_SG['banco']."].");
}
// Verifica se precisa iniciar a sessão
if ($_SG['abreSessao'] == true)
  session_start();
/**
* Função que valida um usuário e senha
*
* @param string $usuario - O usuário a ser validado
* @param string $senha - A senha a ser validada
*
* @return bool - Se o usuário foi validado ou não (true/false)
*/
function validaUsuario($usuario, $senha) {
  global $_SG;
  $cS = ($_SG['caseSensitive']) ? 'BINARY' : '';
  // Usa a função addslashes para escapar as aspas
  $nusuario = addslashes($usuario);
  $nsenha = addslashes($senha);
  // Monta uma consulta SQL (query) para procurar um usuário
  $sql = "SELECT `id`, `nome` FROM `".$_SG['tabela']."` WHERE ".$cS." `usuario` = '".$nusuario."' AND ".$cS." `senha` = '".$nsenha."' LIMIT 1";
  $query = mysql_query($sql);
  $resultado = mysql_fetch_assoc($query);
  // Verifica se encontrou algum registro
  if (empty($resultado)) {
    // Nenhum registro foi encontrado => o usuário é inválido
    return false;
  } else {
    // Definimos dois valores na sessão com os dados do usuário
    $_SESSION['usuarioID'] = $resultado['id']; // Pega o valor da coluna 'id do registro encontrado no MySQL
    $_SESSION['usuarioNome'] = $resultado['nome']; // Pega o valor da coluna 'nome' do registro encontrado no MySQL
    // Verifica a opção se sempre validar o login
    if ($_SG['validaSempre'] == true) {
      // Definimos dois valores na sessão com os dados do login
      $_SESSION['usuarioLogin'] = $usuario;
      $_SESSION['usuarioSenha'] = $senha;
    }
    return true;
  }
}
/**
* Função que protege uma página
*/
function protegePagina() {
  global $_SG;
  if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
    // Não há usuário logado, manda pra página de login
    expulsaVisitante();
  } else if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
    // Há usuário logado, verifica se precisa validar o login novamente
    if ($_SG['validaSempre'] == true) {
      // Verifica se os dados salvos na sessão batem com os dados do banco de dados
      if (!validaUsuario($_SESSION['usuarioLogin'], $_SESSION['usuarioSenha'])) {
        // Os dados não batem, manda pra tela de login
        expulsaVisitante();
      }
    }
  }
}
/**
* Função para expulsar um visitante
*/
function expulsaVisitante() {
  global $_SG;
  // Remove as variáveis da sessão (caso elas existam)
  unset($_SESSION['usuarioID'], $_SESSION['usuarioNome'], $_SESSION['usuarioLogin'], $_SESSION['usuarioSenha']);
  // Manda pra tela de login
  header("Location: ".$_SG['paginaLogin']);
}

Identifique-se

<form action="valida.php" method="POST" id="formLogin"> <label for="login">Usuário</label> <input type="text" name="usuario">
<label for="senha">   Senha</label> <input type="password" name="senha">
<input type="submit" value="Entrar" /> </form>


</body> </html>

Organização da Semana 6

Nesta quinta semana ... Na próxima semana, vou mostrar os softwares que vocês podem utilizar para gravar o vídeo da atividade obrigatória 2.

Prof. Douglas A.

Referências

[1]

[2]



<< <> >>