corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Criando um aplicativo direcionado a banco de dados com o PHP

Lição 5: Adicionando segurança. Implementando o logon do usuário do aplicativo

O conteúdo desta página se aplica ao NetBeans IDE 6.9-7.0

Nesta lição, você implementa a funcionalidade de logon para um criador de lista de desejos. Isso afeta os arquivos seguintes:

  • index.php
  • createNewWisher.php
  • editWishlist.php
  • db.php
Implementar a funcionalidade de Logon consiste nas seguintes etapas:
  1. Salvar o ID do criador de lista de desejos na sessão durante a criação de um criador de lista de desejos
  2. Validar se o usuário que tenta editar um desejo está conectado
  3. Fazer logon do criador de lista de desejos na página index.php

O documento atual é uma parte do tutorial Criando um aplicativo CRUD no NetBeans IDE para PHP.


Código-fonte do aplicativo da lição anterior

Usuários MySQL: clique aqui para baixar o código-fonte que reflete o estado do projeto depois que a lição anterior estiver concluída.

Usuários do banco de dados Oracle: clique aqui para baixar o código-fonte que reflete o estado do projeto depois que a lição anterior estiver concluída.

Salvando o ID do criador de lista de desejos na sessão durante a criação

Uma sessão é um armazenamento duradouro para transferir informações de uma página para outra sem usar um formulário de entrada HTML. Essa funcionalidade tem suporte através de uma matriz PHP predefinida $_SESSION.

Por motivos de segurança, depois que um novo criador de lista de desejos é criado, ele deve se conectar automaticamente sem preencher um formulário. Portanto, você precisa modificar o arquivo createNewWisher.php para implementar a seguinte funcionalidade:

  • Adicione um novo criador de lista de desejos ao banco de dados.
  • Abra uma sessão.
  • Armazenar o nome do criador de lista de desejos na sessão.
  • Transferir o nome do criador de lista de desejos na sessão quando o criador de lista de desejos é redirecionado para a página editWishList.php.
No arquivo createNewWisher.php, localize a linha:
WishDB::getInstance()->create_wisher($_POST["user"], $_POST["password"]);
e indique o seguinte bloco de código abaixo:
session_start();
$_SESSION['user'] = $_POST['user'];
O bloco de código inicia uma sessão, o que significa abrir a matriz $_SESSION para indicar ou recuperar dados. Em seguida, o código adiciona um elemento à matriz $_SESSION. O elemento adicionado contém um valor e um identificador (chave). O valor é o nome dos criadores de lista de desejos recém-criados e o identificador é "user". Em seguida, o programa redireciona o criador de lista de desejos para a página editWishList.php.

Validando o logon do usuário

Quando um usuário alcança a página editWishList.php, o aplicativo deve confirmar que página é acessada pela mesma pessoa que acabou de se registrar na página createNewWisher.php.

Implementar essa funcionalidade consiste em duas etapas:

Recuperando o nome do criador de lista de desejos da sessão

Substitua o código padrão no bloco PHP de editWishList.php pelo seguinte:
session_start();
if (array_key_exists("user", $_SESSION)) {
    echo "Hello " . $_SESSION['user'];
}

O bloco de código abre a matriz $_SESSION para recuperar dados e verifica se $_SESSION contém um elemento com o identificador "user". Se a verificação for bem-sucedida, o código imprime uma mensagem de boas-vindas.

Para verificar se a sessão é implementada corretamente:
  1. Execute o arquivo createNewWisher.php e crie um novo criador de lista de desejos, por exemplo, Jack.
    O editWishList.php abre com "Hello Jack" (Olá, Jack).
  2. Limpe os cookies da sessão em seu navegador ou termine a sessão e execute editWishList.php no IDE.
    O arquivo editWishList.php abre com Hello porque nenhum usuário foi transferido através de uma sessão. Isso não é correto porque permite que alguém que não esteja conectado e não esteja registrado crie ou edite uma lista de desejos. Para evitar isso, o usuário precisa ser redirecionado para a página index.php.

Redirecionando um usuário que não está conectado

Adicione o bloco de código seguinte a editWishList.php, abaixo da cláusula if:
else {
   header('Location: index.php');
   exit;
}

O código redireciona o usuário para a página index.php e cancela a execução do código PHP.

Para verificar se a funcionalidade está implementada corretamente, execute o arquivo editWishList.php. O resultado esperado é que a página index.php se abre.

Fazendo logon na página index.php

O logon na página index.php consiste em duas etapas:

Formulário HTML para logon em index.php

No arquivo index.php, indique o código seguinte antes de fechar a marca </body>:
<form name="logon" action="index.php" method="POST" >
    Username: <input type="text" name="user">
    Password  <input type="password" name="userpassword">
    <input type="submit" value="Edit My Wish List">
</form>

Observação: os avisos do validador HTML podem ser ignorados.

O código apresenta um formulário HTML que permite indicar o nome e a senha do usuário nos campos de texto. Quando o usuário clica em Editar minha lista de desejos, os dados são transferidos para a mesma página, index.php.

Validação de logon

A validação do logon envolve:

Um usuário pode acessar a página index.php ao iniciar o aplicativo, ou na página editWishList.php, ou quando redirecionado da página index.php depois de indicar o nome e a senha.

Como somente no último caso o método de solicitação HTML POST é usado, você sempre pode saber onde o usuário estava localizado quando acessou index.php.

No arquivo index.php, crie um bloco <?php ?> acima do bloco HTML, com o seguinte código:
<?php

require_once("Includes/db.php");
$logonSuccess = false;

// verify user's credentials if ($_SERVER['REQUEST_METHOD'] == "POST") { $logonSuccess = (WishDB::getInstance()->verify_wisher_credentials($_POST['user'], $_POST['userpassword'])); if ($logonSuccess == true) { session_start(); $_SESSION['user'] = $_POST['user']; header('Location: editWishList.php'); exit; } } ?>

O topo do código permite que o usuário use o arquivo db.php e inicialize a variável $logonSuccess com o valor false. Se a validação ocorrer, esse valor mudará para true.

O código que verifica as credenciais do usuário verifica primeiro se o método de solicitação é POST. Se o método for POST, o usuário foi redirecionado depois de enviar o formulário de logon. Nesse caso, o código bloqueia as chamadas da função verify_wisher_credentials com o nome e a senha inseridas no formulário de logon.

A função verify_wisher_credentials, que se escreve na próxima seção, verifica se há um registro na tabela de criadores de desejos em que o usuário e a senha são confrontados com os valores enviados no formulário de logon. Se a função verify_wisher_credentials retornar true, um criador de desejo com a combinação de nome e senha é registrado no banco de dados. Isso significa que a validação ocorreu e que $logonSuccess muda o valor para true. Nesse caso, a seção inicia e a matriz $_SESSION é aberta. Em seguida, o código adiciona um novo elemento à matriz $_SESSION. O elemento contém um valor um identificador (chave). O valor é o nome do criador da lista de desejos e o identificador é "user". Em seguida, o usuário e redirecionado para a página editWishList.php a fim de editar a lista de desejos.

Se a função verify_wisher_credentials retornar false, o valor da variável $logonSuccess permanece false. O valor da variável é usado em exibindo uma mensagem de erro.

Função verify_wisher_credentials

Para implementar a verificação das credenciais do criador de lista de desejos, você precisa adicionar uma nova função à classe WishDB no arquivo db.php. A função requer um nome e uma senha como os parâmetros de entrada e retorna 0 ou 1.

Para o banco de dados MySQL, insira o seguinte bloco de código:
public function verify_wisher_credentials ($name, $password){
$name = $this->real_escape_string($name);
$password = $this->real_escape_string($password);
$result = $this->query("SELECT 1 FROM wishers WHERE name = '" . $name . "' AND password = '" . $password . "'"); return $result->data_seek(0); }

Para o banco de dados Oracle, insira o seguinte bloco de código (como o OCI8 não tem equivalente para mysql_num_rows, este código é uma forma modificada de get_wisher_id_by_name):

public function verify_wisher_credentials($name, $password) {
    $query = "SELECT 1 FROM wishers WHERE name = :name_bv AND password = :pwd_bv";
    $stid = oci_parse($this->con, $query);
    oci_bind_by_name($stid, ':name_bv', $name);
    oci_bind_by_name($stid, ':pwd_bv', $password);
    oci_execute($stid);
//Because name is a unique value I only expect one row
    $row = oci_fetch_array($stid, OCI_ASSOC);
    if ($row) 
        return true;
    else
        return false;
}

O bloco de código executa a pesuisa "SELECT 1 FROM wishers WHERE Name = '" . $name . "' AND Password = '" . $password . "'" e retorna o número de registros que atendem à consulta especificada. Se o registro for encontrado, a função retorna true. Se não há registro no banco de dados, a função retorna false.

Exibindo mensagens de erro

Para permitir que o aplicativo exiba mensagens de erro, indique o seguinte bloco de código <? php?> no formulário de logon em index.php, abaixo dos campos de entrada mas acima do botão:
<?php
  if ($_SERVER["REQUEST_METHOD"] == "POST") { 
      if (!$logonSuccess)
          echo "Invalid name and/or password";
  }
?>
O bloco de código verifica o valor da variável $logonSuccess e se ele for falso, exibe uma mensagem de erro.

Testando o logon na página index.php

Para verificar se a funcionalidade de logon funciona corretamente na página inicial index.php:
  1. Execute o aplicativo.
  2. Na página index.php, indique Tom na caixa de edição Nome do usuário e Tim na caixa de edição Senha.
  3. Pressione Editar minha lista de desejos. É exibida uma mensagem de erro (observe que essa janela de navegador abaixo é reduzida para 600 px de largura, o que acrescenta algumas quebras de linha):
    A página index.php exibe uma mensagem de erro: Nome e/ou senha incorreta
  4. Indique Tom na caixa de edição Nome do usuário e tomcat na caixa de edição Senha.
  5. Clique na lista Editar minha lista de desejos. É exibida a página editWishList.php:
    index.php: Logon bem-sucedido

O código-fonte do aplicativo após a lição atual está concluído

Usuários MySQL: clique aqui para baixar o código-fonte que reflete o estado do projeto depois que a lição estiver concluída.

Usuários do banco de dados Oracle: clique aqui para baixar o código-fonte que reflete o estado do projeto depois que a lição estiver concluída.

Próximas etapas

<< Lição anterior

Próxima lição >>

Voltar à página principal do tutorial



Para enviar comentários e sugestões, obter suporte e manter-se informado sobre os desenvolvimentos mais recentes dos recursos de desenvolvimento em PHP no NetBeans IDE, junte-se à lista de usuários .

Voltar à trilha do aprendizado PHP