Existe uma maneira de evitar que uma página seja renderizada depois que uma pessoa se desconecta, mas clica no botão “voltar”?

StackOverflow https://stackoverflow.com/questions/64059

Pergunta

Tenho um site que requer login e mostra informações confidenciais.

A pessoa acessa a página, é solicitada a fazer login e vê as informações.

A pessoa sai do site e é redirecionada de volta para a página de login.

A pessoa então pode clicar em “voltar” e voltar direto para a página onde as informações confidenciais estão contidas.Como o navegador pensa nele apenas como HTML renderizado, ele mostra isso sem problemas.

Existe uma maneira de evitar que essas informações sejam exibidas quando a pessoa pressiona o botão "voltar" na tela desconectada?Não estou tentando desabilitar o botão Voltar, apenas tentando evitar que informações confidenciais sejam exibidas novamente porque a pessoa não está mais logada no site.

Para fins de argumentação, o site/cenário acima está em ASP.NET com autenticação de formulários (portanto, quando o usuário vai para a primeira página, que é a página que deseja, ele é redirecionado para a página de logon - caso isso faça uma diferença).

Foi útil?

Solução

A resposta curta é que isso não pode ser feito com segurança.

Existem, no entanto, muitos truques que podem ser implementados para dificultar a reação dos usuários e a exibição de dados confidenciais.

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");

Isso desativará o cache no lado do cliente, mas isso é não é compatível com todos os navegadores.

Se você tiver a opção de usar AJAX, os dados confidenciais poderão ser recuperados usando um painel de atualização que é atualizado a partir do código do cliente e, portanto, não serão exibidos ao responder, a menos que o cliente ainda esteja logado.

Outras dicas

Cache e histórico são independentes e um não deve afetar um ao outro.

A única exceção feito para bancos é aquela combinação de HTTPS e Cache-Control: must-revalidate força a atualização ao navegar no histórico.

No HTTP simples, não há maneira de fazer isso, exceto explorando bugs do navegador.

Você poderia hackear isso usando Javascript que verifica document.cookie e redireciona quando um cookie "matador" é definido, mas imagino que isso pode dar errado quando o navegador não define/limpa os cookies exatamente como esperado.

De aspdev.org:

Adicione a seguinte linha no topo do manipulador de eventos Page_Load e sua página ASP.NET não será armazenada em cache nos navegadores dos usuários:

Response.Cache.SetCacheability(HttpCacheability.NoCache)

Configurações esta propriedade garante que se o usuário clicar no botão Voltar o conteúdo desaparecerá, e se ele pressionar "atualizar" ele será redirecionado para a página de login.

DannySmurf, os elementos <meta> são extremamente pouco confiáveis ​​quando se trata de controlar o cache, e o Pragma em particular ainda mais. Referência.

dannyp e outros, o no-cache não impede que os caches armazenem recursos confidenciais.Significa apenas que um cache não pode servir um recurso armazenado sem primeiro revalidá-lo.Se você deseja evitar que recursos confidenciais sejam armazenados em cache, você precisa usar a diretiva no-store.

Você poderia fazer com que uma função javascript fizesse uma verificação rápida do servidor (ajax) e se o usuário não estiver logado, apagasse a página atual e a substituísse por uma mensagem.Obviamente, isso seria vulnerável a um usuário cujo javascript esteja desativado, mas isso é muito raro.Por outro lado, isso é independente da tecnologia de navegador e servidor (asp/php etc).

Você está procurando uma diretiva sem cache:

<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

Se você tem um design de página mestra, isso pode ser um pouco complicado, mas acredito que você pode colocar essa diretiva em uma única página, sem afetar o resto do seu site (assumindo que é isso que você deseja).

Se você tiver essa diretiva definida, o navegador retornará obedientemente ao servidor em busca de uma nova cópia da página, o que fará com que seu servidor veja que o usuário não está autenticado e o levará à página de login.

Faça com que a operação de logout seja uma POST.Então o navegador solicitará "Você tem certeza de que deseja postar novamente o formulário?" em vez de mostrar a página.

Não sei como fazer isso em ASP.NET mas em PHP eu faria algo como:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

O que força o navegador a verificar novamente o item, para que sua verificação de autenticação seja acionada, negando o acesso do usuário.

É um pouco cansativo, mas se você tivesse um miniaplicativo java ou um aplicativo flash incorporado e a autenticação fosse feita por meio disso, você poderia fazer com que eles tivessem que se autenticar em, erm, 'tempo real' com o servidor sempre eles queriam ver as informações.

Usando isso, você também pode criptografar qualquer informação.

Sempre existe a possibilidade de alguém simplesmente salvar a página com as informações confidenciais ativadas; não ter cache não resolverá essa situação (mas sempre será possível fazer uma captura de tela de um aplicativo flash ou java).

Para completar:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));

A resposta correta envolve o uso da configuração do cabeçalho HTTP Cache-Control na resposta.Se você quiser garantir que eles nunca armazenar em cache a saída, você pode fazer Cache-Control:sem cache.Isso também é frequentemente usado em coordenação com no-store.

Outras opções, se você quiser armazenamento em cache limitado, incluem definir um tempo de expiração e revalidação obrigatória, mas todas elas podem fazer com que uma página em cache seja exibida novamente.

Ver http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

Bem, em um grande banco brasileiro (Banco do Brasil), que é conhecido por ter um dos softwares de home banking mais seguros e eficientes do mundo, eles simplesmente colocam history.go(1) em todas as páginas. o botão Voltar, você retornará.Simples.

Por favor, verifique os cabeçalhos de resposta HTTP.A maior parte do código ASP que as pessoas estão postando parece estar configurando isso.Tenha certeza.

O livro esquilo de O'Reilly é a bíblia do HTTP, e Livro HTTP de Chris Shiflett é bom também.

Você pode fazer com que a página da web com o confidencial seja retornada como um HTTP POST e, na maioria dos casos, os navegadores fornecerão uma mensagem perguntando se você deseja reenviar os dados.(Infelizmente não consigo encontrar uma fonte canônica para esse comportamento.)

Acabei de ter o exemplo bancário em mente.

A página do meu banco tem isto:

<meta http-equiv="expires" content="0" />

Isso deveria ser sobre isso, suponho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top