Script de login com botões ocultos
-
08-06-2019 - |
Pergunta
Tenho usado PHP e JavaScript para construir o site do meu pai.Ele quer incorporar um sistema de login em seu site, e eu tenho o design do sistema usando PHP.Meu problema é como faço para mostrar botões se a pessoa estiver logada?
Por exemplo - Você tem Lar, Produtos, Sobre nós, e Contato.Eu quero ter botões para Distribuidor, Distribuidor, e talvez outras informações se o usuário estiver logado.Então eu terei Lar, Produtos, Sobre nós, Contatos, Revendedor (se login do revendedor), Distribuidor (se login do distribuidor) e assim por diante.
O JavaScript seria uma boa maneira de fazer isso ou o PHP, ou talvez ambos?Usando JavaScript para mostrar e ocultar botões e PHP para verificar quais botões mostrar.
Solução
Em relação à segurança, você não pode confiar no que vem do cliente:
- O visitante pode ver todo o seu código (HTML e Javascript, não PHP) e experimentar coisas
- O visitante não pode sequer utilizar um navegador;é trivialmente fácil enviar uma solicitação com um script
Isso significa que ocultar os botões é um bom design de interface do usuário (porque você não pode usá-los se não estiver logado).Mas não é um recurso de segurança.O recurso de segurança é verificar, no servidor, se o visitante está logado antes de cada ação que o requeira.
Se você não pretende mostrar os botões, não adianta enviar o HTML e as imagens para o navegador e depois ocultá-los com Javascript.Eu verificaria com PHP.
Outras dicas
No seu arquivo de menu ou onde você coloca:
<? require 'auth.php' ?>
<ul>
<li><a href="">Home</a></li>
<li><a href="">Products</a></li>
<? if( loggedin() ): ?><li><a href="">Secret area</a></li><? endif; ?>
</ul>
Então, nas páginas que exigem autenticação, faça o seguinte:
<?php
require 'auth.php';
require_login();
?>
Onde auth.php pode conter:
<?php
function loggedin(){
return isset( $_SESSION['loggedin'] );
}
function require_login(){
if( !loggedin() ){
header( 'Location: /login.php?referrer='.$_SERVER['REQUEST_URI'] );
exit;
}
}
?>
Se você usar javascript para ocultar os botões, abrirá uma falha de segurança no aplicativo.Um usuário mal-intencionado pode desabilitar o javascript ou aplicar algum deles para contornar sua segurança.
Sugiro usar PHP para escolher renderizar os botões ou não.Faço isso no .NET com bastante frequência.
Você também poderá verificar o acesso do usuário no lado do servidor sempre que ele tentar usar um botão restrito.
O que fizemos no meu trabalho foi ter uma biblioteca que oferece funções como verificar se o usuário está logado.Por exemplo:
<?php
require_once 'Auth.php';
// output some html
if (isLoggedIn()) {
echo 'html for logged in user';
}
// rest of html
Para páginas que apenas usuários autenticados devem ver, o controlador verifica se eles estão logados e, caso contrário, os redireciona para a página de login.
<?php
public function viewCustomer($customerId) {
if (!isLoggedIn())
redirectToLoginPage();
}
Tudo o que Christian Lescuyer escreveu está correto.Observe, entretanto, que ele disse “eu faria” e não “você deveria”.A escolha não é tão fácil.
Em primeiro lugar, a segurança não é um problema na escolha.Você deve fazer uma verificação de segurança no servidor ao executar uma ação.Qual código decide mostrar/ocultar o botão que leva à ação é irrelevante.
Isso nos deixa com apenas uma desvantagem de fazer a lógica mostrar/ocultar em Javascript - o HTML enviado ao usuário é maior que o necessário.Isso pode não ser grande coisa.
Porém, ter lógica mostrar/ocultar no PHP tem um sinal de menos.O código PHP necessário geralmente é um sopa de etiqueta.O código de Akira fornece um bom exemplo de como isso geralmente é feito.
O código Javascript correspondente provavelmente seria algo assim:
if (logged())
{
elementSecretArea.style.display = "list-item";
}
(assumindo que os elementos que poderiam ser ocultados tenham display:none por padrão).
Este estilo também permite um bom cenário "Ajax":o usuário vê uma página sem área secreta, insere a senha, vê a área secreta sem atualizar a página.
Portanto, se você já possui um script que é executado quando o documento é carregado por outros motivos, eu consideraria seriamente ter uma lógica de mostrar/ocultar nele.
Basicamente onde você tem seu menu em html, digamos como uma lista <ul> <li>Home</li> </ul>
você adiciona php depois </li>
do último item:
<?php
if($session-logged_in) {
?>
<li>My Account</li>
<?php
}
?>