| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <!-- |
| Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. |
| --> |
| <html> |
| <head> |
| <title>Criando uma Aplicação Orientada pelo Banco de Dados Com o PHP. Implementando a Segurança. Log-in</title> |
| <meta name="KEYWORDS" content="CRUD, Update, Delete, MySQL, PHP, NetBeans"> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <meta name="DESCRIPTION" content="Creating a Database Driven Application With PHP. Implementing Security. Logon" > |
| <link rel="stylesheet" type="text/css" href="../../../netbeans.css" media="screen"></head> |
| <body> |
| <h1>Criando uma Aplicação Orientada pelo Banco de Dados com o PHP </h1> |
| <h1>Lição 5: Adicionando Segurança. Implementando o Log-in do Usuário da Aplicação</h1> |
| <div style="margin-left:-3px"> |
| <div class="feedback-box margin-around float-left" style="margin-right:15px"> |
| <h4>Conteúdo do tutorial:</h4> |
| <ol start="0"> |
| <li><a href="wish-list-tutorial-main-page.html">Criando uma Aplicação Orientada pelo Banco de Dados com o PHP - Página Principal</a></li> |
| <li><p>Criando o Banco de Dados</p> <ol type="a"><li><a href="wish-list-lesson1.html">Criando um Banco de Dados MySQL</a></li> |
| <li><a href="wish-list-oracle-lesson1.html">Criando Tabelas do Banco de Dados Oracle</a></li> |
| </ol></li> |
| <li><a href="wish-list-lesson2.html">Projetando a Aplicação. Lendo o Banco de Dados</a></li> |
| <li><a href="wish-list-lesson3.html">Criando um Novo Usuário da Aplicação</a></li> |
| <li><a href="wish-list-lesson4.html">Otimizando o Código</a></li> |
| <li> |
| <p><b>=> Adicionando Segurança. Implementando o Log-in de Usuário a Aplicação</b></p> |
| <ul> |
| <li><a href="#previousLessonSourceCode">Código-fonte da Aplicação da Lição Anterior</a></li> |
| <li><a href="#savingWisherIDInSessionUponCreation">Salvando o wisher ID na Sessão Em Criação</a></li> |
| <li><a href="#validateWisherLogon">Validando o Log-in do Usuário</a> |
| <ul> |
| <li><a href="#retrievingUserNameFromSession">Recuperando o nome do wisher na Sessão</a></li> |
| <li><a href="#redirectingNotLoggedInUserToIndexPage">Redirecionando um Usuário Que Não Está Conectado</a></li> |
| </ul> |
| </li> |
| <li><a href="#logonFromIndexPage">Fazendo Log-in na Página index.php</a> |
| <ul> |
| <li><a href="#logonForm">Form HTML para Log-in em index.php</a></li> |
| <li><a href="#logonValidation">Validação de Log-in</a></li> |
| <li><a href="#verifyWisherCredentials">Função verify_wisher_credentials</a></li> |
| |
| <li><a href="#displayErrorMessage">Exibindo Mensagens de Erro</a></li> |
| </ul> |
| </li> |
| <li><a href="#testingLogonFromIndexPage">Testando o Log-in na Página index.php</a></li> |
| <li><a href="#lessonResultSourceCode">O Código-fonte da Aplicação após a Lição Atual está Concluído</a></li> |
| </ul></li> |
| <li><a href="wish-list-lesson6.html">Adicionando um Novo Desejo ao Banco de Dados</a></li> |
| <li><a href="wish-list-lesson7.html">Atualizando e Deletando Entradas no Banco de Dados</a></li> |
| <li><a href="wish-list-lesson8.html">Melhorando a Aparência da Aplicação Usando a Tecnologia CSS</a></li> |
| <li><a href="wish-list-lesson9.html">Implantando a Aplicação em um Servidor Web Remoto</a></li> |
| </ol> |
| </div> |
| </div> |
| <img alt="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0"> |
| |
| <p>Nesta lição, você implementará a funcionalidade de log-in para um wisher. Isso afeta os seguintes arquivos: </p> |
| <ul> |
| <li style="margin-left:40em"><tt>index.php</tt></li> |
| <li style="margin-left:40em"><tt>createnewwisher.php</tt></li> |
| <li style="margin-left:40em"><tt>editWishlist.php</tt></li> |
| <li style="margin-left:40em"><tt>db.php</tt></li> |
| </ul> |
| Implementar a funcionalidade de log-in consiste nas seguintes etapas: |
| <ol> |
| <li style="margin-left:40em"><a href="#savingWisherIDInSessionUponCreation">Salvar o wisher ID na Sessão em criação de um wisher</a></li> |
| <li style="margin-left:40em"><a href="#validateWisherLogon">Validar se o usuário que tenta editar um desejo está conectado</a></li> |
| <li style="margin-left:40em"><a href="#logonFromIndexPage">Fazer log-in do wisher na página index.php</a></li> |
| </ol> |
| <p>O documento atual é uma parte do tutorial Criando uma Aplicação CRUD no NetBeans IDE para PHP. </p> |
| <br style="clear:left"> |
| |
| <h2><a name="previousLessonSourceCode"></a>Código-fonte da Aplicação da Lição Anterior</h2> |
| <p>Usuários MySQL: clique <a href="https://netbeans.org/files/documents/4/1930/lesson4.zip" target="_blank">aqui</a> para fazer o download do código-fonte que reflete o estado do projeto depois que a lição anterior estiver concluída. </p> |
| <p>Usuários do banco de dados Oracle: clique <a href="https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson4.zip" target="_blank">aqui</a> para fazer o download do código-fonte que reflete o estado do projeto depois que a lição anterior for concluída.</p> |
| <h2><a id="savingWisherIDInSessionUponCreation" name="savingWisherIDInSessionUponCreation"></a>Salvando o wisher ID na Sessão Em Criação</h2> |
| <p>Uma <a href="http://us2.php.net/manual/en/ref.session.php" target="_blank">Sessão</a> é um armazenamento duradouro para transferir informações de uma página para outra sem usar um <a href="wish-list-lesson5.html#htmlForm">form de entrada HTML</a>. Essa funcionalidade tem suporte por meio de um array PHP predefinido <tt>$_SESSION</tt>. </p> |
| <p>Por motivos de segurança, depois que um novo wisher é criado, ele deve se conectar automaticamente sem preencher um form. Portanto, você precisa modificar o arquivo <tt>createNewWisher.php</tt> para implementar a seguinte funcionalidade:</p> |
| <ul> |
| <li>Adicione um novo wisher ao banco de dados.</li> |
| <li>Abra uma sessão. </li> |
| <li>Armazene o nome do wisher na sessão.</li> |
| <li>Transfira o nome do wisher na sessão quando ele for redirecionado para a página <tt>editWishList.php</tt>. </li> |
| </ul> |
| No arquivo <tt>createNewWisher.php</tt>, localize a linha: |
| <pre class="examplecode">WishDB::getInstance()->create_wisher($_POST["user"], $_POST["password"]);</pre> |
| e insira o seguinte bloco de código abaixo: |
| <pre class="examplecode">session_start(); |
| $_SESSION['user'] = $_POST['user'];</pre> |
| O bloco de código inicia uma sessão, o que significa abrir o array <tt>$_SESSION</tt> para inserir ou recuperar dados. Em seguida, o código adiciona um elemento ao array <tt>$_SESSION</tt>. O elemento adicionado contém um valor e um identificador (chave). O valor é o nome dos wishers recém-criados e o identificador é "user". Em seguida, o programa redireciona o wisher para a página <tt>editWishList.php</tt>. |
| <h2><a id="validateWisherLogon" name="validateWisherLogon"></a>Validando o Log-in do Usuário </h2> |
| <p>Quando um usuário chega à página <tt>editWishList.php</tt>, a aplicação deve confirmar que a página foi acessada pela mesma pessoa que acabou de se registrar na página <tt>createNewWisher.php</tt>. </p> |
| <p>Implementar essa funcionalidade consiste em duas etapas: |
| </p> |
| <ul> |
| <li><a href="#retrievingUserNameFromSession">Recuperando o nome do wisher na Sessão</a></li> |
| <li><a href="#redirectingNotLoggedInUserToIndexPage">Redirecionar o usuário para o index.php, caso a recuperação do nome do wisher na sessão tenha falhado</a></li> |
| </ul> |
| <div class="indent"> |
| <h3><a id="retrievingUserNameFromSession" name="retrievingUserNameFromSession"></a>Recuperando o Nome do Wisher da Sessão</h3> |
| Substitua o código default no bloco PHP de <tt>editWishList.php</tt> pelo seguinte: |
| <pre class="examplecode">session_start(); |
| if (array_key_exists("user", $_SESSION)) { |
| echo "Hello " . $_SESSION['user']; |
| }</pre> |
| <p>O bloco de código abre o array <tt>$_SESSION</tt> para recuperar dados e verifica se <tt>$_SESSION</tt> contém um elemento com o identificador "user". Se a verificação for bem-sucedida, o código imprime uma mensagem de boas-vindas. </p> |
| Para verificar se a sessão foi implementada corretamente: |
| <ol> |
| <li> Execute o arquivo <tt>createNewWisher.php</tt> e crie um novo wisher, por exemplo, Jack.<br> O <tt>editWishList.php</tt> abre com "Hello Jack" (Olá, Jack). </li> |
| <li>Limpe os cookies da sessão em seu browser ou termine a sessão e execute <tt>editWishList.php</tt> no IDE.<br> O arquivo <tt>editWishList.php</tt> abre com Hello porque nenhum usuário foi transferido a 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 <tt>index.php</tt>.</li> |
| </ol> |
| <h3><a id="redirectingNotLoggedInUserToIndexPage" name="redirectingNotLoggedInUserToIndexPage"></a>Redirecionando um Usuário Que Não Está Conectado </h3> |
| Adicione o bloco de código seguinte ao <tt>editWishList.php</tt>, abaixo da cláusula <tt>if</tt>: |
| <pre class="examplecode">else { |
| header('Location: index.php'); |
| exit; |
| }</pre> |
| |
| <p>O código redireciona o usuário para a página index.php e cancela a execução do código PHP. </p> |
| Para verificar se a funcionalidade foi implementada corretamente, execute o arquivo <tt>editWishList.php</tt>. O resultado esperado é que a página <tt>index.php</tt> abra.</div> |
| <h2><a id="logonFromIndexPage" name="logonFromIndexPage"></a>Fazendo log-in na página index.php</h2> |
| <p>O log-in na página index.php consiste em duas etapas:</p> |
| <ul> |
| <li><a href="#logonForm">Indicando o nome e a senha do usuário em um form de entrada HTML e enviando os dados para validação à página index.php.</a></li> |
| <li><a href="#logonValidation">Validando o log-in</a></li> |
| </ul> |
| <div class="indent"><h3><a id="logonForm" name="logonForm"></a>Form HTML para Log-in em index.php</h3> |
| No arquivo <tt>index.php</tt>, insira o código a seguir antes de fechar a tag <tt></body></tt>: |
| <pre class="examplecode"><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></pre> |
| <p class="notes"><b>Observação: </b>você pode ignorar as advertências do validador HTML.</p> |
| |
| O código apresenta um <a href="wish-list-lesson3.html#htmlForm">form HTML</a> que permite inserir 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. |
| <h3><a id="logonValidation" name="logonValidation"></a>Validação de Log-in</h3> |
| <p>A validação do log-in envolve: </p> |
| <ul> |
| <li><a href="#checkWhereUserCameFrom">Verificação de onde o usuário foi redirecionado</a>. </li> |
| <li><a href="#verifyCredentials">Verificação do nome e senha do usuário</a>. </li> |
| <li>Salvar o nome do usuário na Sessão e redirecionar o usuário para a página editWishList.php ou <a href="#displayErrorMessage">Exibir uma mensagem de erro.</a> </li> |
| </ul> |
| |
| <p> Um usuário pode acessar a página <tt>index.php</tt> ao iniciar a aplicação, ou na página<a href="#validateWisherLogon"> editWishList.php</a>, ou quando redirecionado da página <tt>index.php</tt> depois de inserir o nome e a senha.</p> |
| <p>Como o <a href="http://www.htmlcodetutorial.com/forms/_FORM_METHOD.html" target="_blank">método de solicitação HTML</a> POST é usado somente em último caso, você sempre pode saber onde o usuário estava localizado quando acessou o <tt>index.php</tt>.</p> |
| No arquivo index.php, crie um bloco <?php ?> acima do bloco HTML, com o seguinte código: |
| <pre class="examplecode"><?php |
| |
| require_once("Includes/db.php"); |
| $logonSuccess = false;<br><br> |
| // 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; |
| } |
| } |
| ?> |
| </pre> |
| <p>O início do código permite que o usuário use o arquivo <tt>db.php</tt> e inicialize a variável <tt>$log-inSuccess</tt> com o valor <tt>false</tt>. Se a validação ocorrer, esse valor mudará para <tt>true</tt>. </p> |
| |
| |
| <p>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 <a href="#logonForm">form de log-in</a>. Nesse caso, o bloco de código chama a função <tt>verify_wisher_credentials</tt> com o nome e a senha inseridas no form de log-in. </p> |
| <p>A função <tt>verify_wisher_credentials</tt>, que você escreverá <a href="#verifyWisherCredentials">na próxima seção</a>, verifica se há um registro na tabela de <tt>wishers</tt> em que o usuário e a senha são confrontados com os valores enviados no <a href="#logonForm">form de log-in</a>. Se a função <tt>verify_wisher_credentials</tt> retornar <tt>true</tt>, um wisher com a combinação de nome e senha será registrado no banco de dados. Isso significa que a validação ocorreu e que <tt>$log-inSuccess</tt> muda o valor para <tt>true</tt>. Nesse caso, a seção é iniciada e o array <tt>$_SESSION</tt> abre. O código adiciona um novo elemento ao array <tt>$_SESSION</tt>. O elemento contém um valor e um identificador (chave). O valor é o nome do wisher e o identificador é "user". Em seguida, o código redireciona o usuário para a página <tt>editWishList.php</tt> para editar a lista de desejos. </p> |
| <p>Se a função <tt>verify_wisher_credentials</tt> retornar <tt>false</tt>, o valor da variável <tt>$log-inSuccess</tt> permanece falso. O valor da variável é usado em <a href="#displayErrorMessage">exibindo uma mensagem de erro</a>. </p> |
| <h3><a id="verifyWisherCredentials" name="verifyWisherCredentials"></a>Função verify_wisher_credentials</h3> |
| <p>Para implementar a verificação das credenciais do wisher, você precisa adicionar uma nova função à classe <tt>WishDB</tt> no arquivo <tt>db.php</tt>. A função requer um nome e uma senha como parâmetros de entrada e retorna 0 ou 1.</p> |
| <strong>Para o banco de dados MySQL</strong>, insira o seguinte bloco de código: |
| <pre class="examplecode">public function verify_wisher_credentials ($name, $password){<br> $name = $this->real_escape_string($name);<br> |
| $password = $this->real_escape_string($password);<br> $result = $this->query("SELECT 1 FROM wishers |
| WHERE name = '" . $name . "' AND password = '" . $password . "'"); |
| return $result->data_seek(0); |
| }</pre> |
| <p><b>Para o banco de dados Oracle</b>, insira o seguinte bloco de código (como o OCI8 não tem equivalente para <tt>mysql_num_rows</tt>, este código é uma forma modificada de <tt>get_wisher_id_by_name</tt>):</p> |
| <pre class="examplecode">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; |
| }</pre> |
| <p>O bloco de código executa a consulta <tt> "SELECT 1 FROM wishers WHERE Name = '" . $name . "' AND Password = '". $password. "'"</tt> e retorna o número de registros que atendam à consulta especificada. Se o registro for encontrado, a função retorna <tt>true</tt>. Se não houver registro no banco de dados, a função retornará <tt>false</tt>. |
| <h3><a id="displayErrorMessage" name="displayErrorMessage"></a>Exibindo Mensagens de Erro</h3> |
| |
| Para permitir que a aplicação exiba mensagens de erro, insira o seguinte bloco de código <? php?> no form de log-in em <tt>index.php</tt>, abaixo dos campos de entrada, mas acima do botão: |
| <pre class="examplecode"><?php |
| if ($_SERVER["REQUEST_METHOD"] == "POST") { |
| if (!$logonSuccess) |
| echo "Invalid name and/or password"; |
| } |
| ?></pre> |
| O bloco de código verifica o valor da variável $log-inSuccess e se ele for falso, exibe uma mensagem de erro.</div> |
| <h2><a name="testingLogonFromIndexPage"></a>Testando o Log-in na Página index.php </h2> |
| Para verificar se a funcionalidade de log-in funciona corretamente na página inicial <tt>index.php</tt>: |
| <ol> |
| <li>Execute a aplicação.</li> |
| <li>Na página <tt>index.php</tt>, digite Tom na caixa de edição Nome do Usuário e Tim na caixa de edição Senha. </li> |
| <li>Pressione Editar Minha Lista de Desejos. É exibida uma mensagem de erro (observe que a janela de browser abaixo é reduzida para 600 px de largura, o que acrescenta algumas quebras de linha): <br><img alt="A página index.php exibirá uma mensagem de erro: Nome e/ou Senha Incorretos" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson5/incorrectNamePasswordIndex.png"></li> |
| <li>Digite Tom na caixa de edição Nome de Usuário e tomcat na caixa de edição Senha.</li> |
| <li>Clique em Editar Minha Lista de Desejos. É exibida a página editWishList.php: <br><img alt="index.php: Log-in efetuado com Êxito" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson5/SuccessfulLogonOnIndexRedirectToEditWishList.png"></li> |
| </ol> |
| <h2><a name="lessonResultSourceCode"></a>O código-fonte da Aplicação após a Lição Atual está Concluído </h2> |
| <p>Usuários MySQL: clique <a href="https://netbeans.org/files/documents/4/1931/lesson5.zip" target="_blank">aqui</a> para fazer o download do código-fonte que reflete o estado do projeto depois que a lição estiver concluída.</p> |
| <p>Usuários do banco de dados Oracle: clique <a href="https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson5.zip" target="_blank">aqui</a> para fazer o download do código-fonte que reflete o estado do projeto depois que a lição for concluída.</p> |
| <h2><a name="nextSteps"></a>Próximas Etapas</h2> |
| <p><a href="wish-list-lesson4.html"><< Lição anterior</a></p> |
| <p><a href="wish-list-lesson6.html">Próxima lição >></a></p> |
| <p><a href="wish-list-tutorial-main-page.html">Voltar à página principal do Tutorial</a></p><br> |
| <div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Wish%20List%20CRUD%205:%20Implementing%20Security">Enviar Feedback neste Tutorial</a></div> |
| <br style="clear:both;" > |
| <p>Para enviar comentários e sugestões, obter suporte e manter-se informado sobre os desenvolvimentos mais recentes das funcionalidades de desenvolvimento PHP do NetBeans IDE, <a href="../../../community/lists/top.html">junte-se à lista de correspondência users@php.netbeans.org</a>. |
| <p><a href="wish-list-tutorial-main-page.html"></a> |
| <p><a href="../../trails/php.html">Voltar à Trilha do Aprendizado PHP</a></p> |
| </body> |
| </html> |