Pergunta

Existem 'melhores práticas' sobre como se deve devolver um usuário à sua página original após o login no seu site, especificamente no PHP? Por exemplo, se eu estiver visualizando uma pergunta do StackOverflow enquanto não estiver conectado, como você garantiria que eu volte a essa pergunta se eu conectei?

Da minha pesquisa, parece que muitos conselhos se concentram na variável $ _erver ['http_referer']. Basicamente, você anota o referente e o armazena na sessão e depois redireciona para essa página quando terminar.

O problema com isso é que o http_referer não é confiável na melhor das hipóteses.

Isso é definido pelo agente do usuário. Nem todos os agentes de usuário definirão isso e alguns fornecem a capacidade de modificar o HTTP_Referer como um recurso. Em suma, não é realmente confiável.
— [http://php.net/manual/en/reserved.variables.server.php

Quaisquer edições ao referente a redirecionar para outras áreas do site serão tratadas por verificações de permissões de rotina. Se o referente for apagado, pode ser aceitável simplesmente redirecionar o usuário para a página principal do site, em vez da página de onde eles vieram. Isso parece desnecessariamente um usuário hostil, e eu esperava que houvesse uma maneira melhor de lidar com isso.

Foi útil?

Solução

Na página de login:

<form action="controller/LoginController" method="post">
<?php

if (isset($_SERVER['HTTP_REFERER'])) {
  echo '<input type="hidden" name="l" value="'.htmlspecialchars($_SERVER['HTTP_REFERER']).'" />';
}

?>
<!-- the rest of the form -->
<input type="submit" />
</form>

No controlador de login, você aprecia o $_POST['l'] Valor e veja se este URL está ou não em seu próprio site. Caso contrário, redirecione para sua página padrão, senão redirecionar para este URL.

Certifique -se de que, na sua página de login, se o usuário já estiver conectado, você redireciona o usuário de volta à página inicial ou algo assim. Isso impedirá casos como redirecionar de volta para o login.

$_SERVER['HTTP_REFERER'] é uma responsabilidade do navegador. Também é na maioria das vezes bastante confiável. Se o navegador não enviar, ou se você estiver preocupado, poderá usar a sessão.

Em todas as páginas, basta definir $_SESSION['lastvisitpage'] Para o URL da página atual. No login, então você redireciona para $_SESSION['lastvisitpage'].

Desde $_SERVER['HTTP_REFERER'] Pode ser falsificado por um usuário a qualquer momento, sempre se deve tratar qualquer outra variável fornecida pelo usuário escape corretamente.

Outras dicas

Seria melhor se você armazenar a última página visitada por conta própria, talvez com a ajuda de uma sessão.

Se o usuário solicitar uma página do seu site pela primeira vez, inicie uma nova sessão e inicialize Último Uri com o URI atual. Atualize isso Último Uri Sempre que outra página é solicitada até que seja a página de login. Agora, se a autenticação for bem -sucedida, você poderá redirecionar para o usuário para o URI em Último Uri.

E se você tiver um formulário de login em todas as páginas, use uma entrada oculta na qual o URI atual seja armazenado.

if(user_not_logged_in())
{
    $link = "http://example.com/login?continue=path/to/current/page";
    echo '<a href="'.$link.'">Loign</a>';
}

É assim que eu, e sites como o Google faz isso. Você precisaria verificar a variável continuar a variável e higienizá -la de URLs estranhos primeiro.

Outra opção é usar ojax e permitir que o usuário faça login em qualquer página. O usuário faz login, você envia o formulário via Ajax, atualize quando a solicitação voltar.


Eu acho que você pode estar perguntando se o usuário clica especificamente no link de login em um menu, você pensa automaticamente que o usuário deseja ser redirecionado para a página da qual pressionaram o botão. Eu acredito que é uma falha na lógica. Tome StackOverflow. Só porque pressiono o login não significa que quero voltar à pergunta em que estive pela última vez.

No entanto, há alguns casos de que seria correto assumir que a pessoa quer voltar, como se eu votasse uma pergunta e tivesse o pop -up me dizendo para fazer login. Se eu cliquei no link lá, seria seguro assumir que quero voltar. Mas apenas o link de login na barra de navegação não tem esse significado implícito.

Sugiro que faça uma chamada AJAX para fazer login o usuário e, com uma resposta bem -sucedida do Ajax, apenas atualize a página atual.

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