3
respostas

Dúvida

Quando eu clico na seta do navegador para voltar depois de ter feito logout, ele consegue voltar para a tela inicial, mesmo n estando logado.
Insira aqui a descrição dessa imagem para ajudar na acessibilidade
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como posso corrigir isso ?

Rotas :

return [
    'GET|/' => \Alura\Mvc\Controller\VideoListController::class,
    'GET|/novo-video' => \Alura\Mvc\Controller\VideoFormController::class,
    'POST|/novo-video' => \Alura\Mvc\Controller\NewVideoController::class,
    'GET|/editar-video' => \Alura\Mvc\Controller\VideoFormController::class,
    'POST|/editar-video' => \Alura\Mvc\Controller\EditVideoController::class,
    'GET|/remover-video' => \Alura\Mvc\Controller\DeleteVideoController::class,
    'GET|/login' => \Alura\Mvc\Controller\LoginFormController::class,
    'POST|/login' => \Alura\Mvc\Controller\LoginController::class,
    'GET|/logout' => \Alura\Mvc\Controller\LogoutController::class,
];
3 respostas

Olá, Edvan!

A sua observação é extremamente importante e demonstra um excelente olhar para a segurança de aplicações web.

O que você está enfrentando é um comportamento padrão de navegadores, que salvam uma cópia da página no cache para que o usuário possa voltar rapidamente. Mesmo que a sua sessão tenha sido encerrada, o navegador ainda tem uma cópia da página que foi exibida antes do logout.

Para corrigir isso, você precisa instruir o navegador a não armazenar em cache as páginas que exigem autenticação. A melhor forma de fazer isso é adicionando cabeçalhos HTTP específicos em suas respostas.

Você deve adicionar os seguintes cabeçalhos na sua página que precisa de login:

header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.

Explicação dos cabeçalhos:

  • Cache-Control: no-cache, no-store, must-revalidate: Este cabeçalho é o mais moderno e robusto. Ele diz ao navegador para não armazenar a página em cache, para não salvar no histórico e para sempre revalidar a página com o servidor.

  • Pragma: no-cache: Este é um cabeçalho mais antigo, mas é bom para garantir a compatibilidade com navegadores mais antigos.

  • Expires: 0: Este cabeçalho também é para compatibilidade, e define a data de expiração da página para o passado, o que garante que a página será considerada "expirada" e não será exibida do cache.

Esses cabeçalhos devem ser adicionados no início da sua página, antes de qualquer saída HTML.

Espero que essa dica resolva o seu problema e garanta a segurança da sua aplicação!

Eu fiz isso e ainda continua com o problema de poder voltar, quero outra solução por favor.
Adicionei assim que é iniciado a sessão :

session_start();
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.
$isLoginRoute = $pathInfo === '/login';

Adicionei também, antes das chamadas de login :

class LoginFormController implements Controller
{

    public function processaRequisicao(): void
    {
        if (isset($_SESSION['logado']) and $_SESSION['logado'] === true) {
            header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
            header("Pragma: no-cache"); // HTTP 1.0.
            header("Expires: 0"); // Proxies.
            header('Location: /');
            return;
        }
        require_once __DIR__ . '/../../views/login-form.php';
    }
}

Ainda sim permanece com isso, até baixei o código do professor e continua.

O que eu fiz foi adicionar no final dos arquivos .html
Para caso eu volte ele recarregue a página, não sei se é a melhor forma, mas foi a que deu certo.

<script>
    window.addEventListener("pageshow", function(event) {
        if (event.persisted) {
            window.location.reload();
        }
    });
</script>