4

Web サイト、特に PHP にログインした後、ユーザーを元のページに戻す方法に関する「ベスト プラクティス」はありますか? たとえば、ログインしていないときに StackOverflow の質問を表示している場合、ログインしたときにこの質問に戻るようにするにはどうすればよいですか?

私の調査によると、多くのアドバイスは $_SERVER['HTTP_REFERER'] 変数に集中しているようです。基本的に、リファラーをメモしてセッションに保存し、完了したらそのページにリダイレクトします。

これに関する問題は、HTTP_REFERER がせいぜい信頼できないことです。

これは、ユーザー エージェントによって設定されます。すべてのユーザー エージェントがこれを設定するわけではなく、機能として HTTP_REFERER を変更する機能を提供するユーザー エージェントもあります。要するに、本当に信用できない。
— [ http://php.net/manual/en/reserved.variables.server.php]

サイトの他の領域にリダイレクトするリファラーへの編集は、定期的な権限チェックによって処理されます。リファラーが空白になった場合、ユーザーを元のページではなく、サイトのメイン ページにリダイレクトするだけで問題ない場合があります。しかし、これは不必要にユーザーの敵対的なように思えます。これを処理するためのより良い方法があることを望んでいました.

4

4 に答える 4

6

ログインページ:

<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>

ログイン コントローラーで$_POST['l']値を取得し、この URL が自分の Web サイト上にあるかどうかを確認します。そうでない場合はデフォルトのページにリダイレクトし、そうでない場合はこの URL にリダイレクトします。

ユーザーがすでにログインしている場合は、ログインページで、ユーザーをホームページなどにリダイレクトするようにしてください。これにより、ログインにリダイレクトされるなどのケースが防止されます。

$_SERVER['HTTP_REFERER']ブラウザの責任です。また、ほとんどの場合、かなり信頼できます。ブラウザが送信しない場合、またはそれが心配な場合は、代わりにセッションを使用できます。

すべてのページ$_SESSION['lastvisitpage']で、現在のページ URL に設定するだけです。ログインすると、にリダイレクトされ$_SESSION['lastvisitpage']ます。

$_SERVER['HTTP_REFERER']ユーザーはいつでも偽造できるため、適切にエスケープすることにより、他のユーザー指定の変数を常に扱う必要があります。

于 2009-12-31T08:51:47.563 に答える
3

おそらくセッションの助けを借りて、最後にアクセスしたページを自分で保存する方がよいでしょう。

ユーザーが初めて Web サイトからページを要求した場合は、新しいセッションを開始し、last-URIを現在の URI で初期化します。ログインページになるまで、別のページが要求されるたびに、この最後の URI を更新します。認証が成功すると、ユーザーをlast-URIの URI にリダイレクトできます。

また、すべてのページにログイン フォームがある場合は、現在の URI が格納されている隠し入力を使用します。

于 2009-12-31T08:54:30.983 に答える
1
if(user_not_logged_in())
{
    $link = "http://example.com/login?continue=path/to/current/page";
    echo '<a href="'.$link.'">Loign</a>';
}

これは、私や Google などのサイトが行っている方法です。ただし、最初に continue 変数を確認し、変な URL をサニタイズする必要があります。

もう 1 つのオプションは、AJAX を使用して、ユーザーが任意のページからログインできるようにすることです。ユーザーがログインし、AJAX 経由でフォームを送信し、リクエストが戻ってきたら更新します。


ユーザーがメニューのログイン リンクをクリックしたかどうかを尋ねていると思いますが、ユーザーはボタンを押したページにリダイレクトされることを望んでいると自動的に考えます。これは論理の欠陥だと思います。StackOverflow を見てみましょう。ログインを押したからといって、前回の質問に戻りたいというわけではありません。

ただし、質問に賛成票を投じてログインを求めるポップアップが表示された場合など、その人が戻りたいと想定するのが正しい場合もあります。そこのリンクをクリックすると、元に戻りたいと思うのは安全です。しかし、ナビゲーション バーのログイン リンクだけでは、暗黙の意味はありません。

于 2009-12-31T09:12:04.027 に答える
0

ユーザーにログインするためにAJAX呼び出しを行い、AJAX応答が成功したら現在のページを更新することをお勧めします。

于 2009-12-31T08:54:12.673 に答える