0

30 分後に現在のユーザー セッションを破棄しようとしました。それは正常に動作します。問題は

1)他のユーザーが新しいタブでWebページのリンクを開くと、ログインプロセスを実行せずにページにアクセスできます。

私はこのチュートリアルに従おうとしました

http://www.homeandlearn.co.uk/php/php14p3.html

<?PHP

session_start();

if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) {
header ("Location: login.php");
}

?>

しかし、それは機能していません。古いセッションがまだ破棄されていないため (30 分未満)。

私は何をすべきか??

4

1 に答える 1

2

通常、ユーザーのログイン セッションは Web サイトごとに 1 つの Cookie に保存され、1 つのブラウザーのすべてのウィンドウとタブで共有されます。ブラウザで Cookie をクリアすると、再度ログインする必要があります。これは、次にリモート Web サイト (PHP サイト) にアクセスしたときに、古いセッション ID で Cookie を渡さなくなるためです。

これは、2 人のユーザーが同じブラウザーを使用している場合に問題を引き起こします。これは、Web サイトの Cookie が両方のユーザーで同じであるためです。

1 つのオプションは、PHP サイトに手動の「ログアウト」ボタンを提供することです。これにより、30 分のタイムアウトが発生する前にセッションが破棄されます。ただし、完了時にユーザーがこのボタンをクリックするという保証はありません。

セッションIDの受け渡しに関するPHPドキュメントから:

セッション ID を伝搬するには、次の 2 つの方法があります。

  • クッキー

  • URL パラメータ

セッション モジュールは両方の方法をサポートします。Cookie が最適ですが、常に使用できるとは限らないため、別の方法も提供しています。2 番目の方法は、セッション ID を URL に直接埋め込みます。

これは、実行時オプションを有効にしsession.use_trans_sid、セッション ID を Cookie に保存する代わりにすべての URL に埋め込む別のオプションがあることを示しています。mysession=123これにより、次の URL の末尾にある値のようなものが得られます。www.example.com/home.php?mysession=123

したがって、ユーザー 1 が www.example.com にアクセスしてログインを実行するとmysession=123、セッションがアクティブである限り、すべてのリンクが最後に表示されます。

次に、ユーザー 2 が新しいタブで www.example.com を参照すると、mysession=###入力した URL に値がなかったため、再度ログインするように求められます。このタブでログインすると、すべてのリンクに mysession のような新しい値が設定されます。www.example.com/home.php?mysession=345

警告: PHP ドキュメントのuse-trans-sid 設定に関するこのメモでわかるように、ほとんどのサイトが Cookie の使用を好むのには理由があります。

URL ベースのセッション管理には、Cookie ベースのセッション管理と比較して、追加のセキュリティ リスクがあります。たとえば、アクティブなセッション ID を含む URL を友人にメールで送信したり、セッション ID を含む URL をブックマークに保存して、常に同じセッション ID でサイトにアクセスしたりできます。

于 2012-05-16T03:03:17.130 に答える