私は Web のあらゆる場所を見てきましたが、SESSION 変数のニュアンスを明確にする必要があります。
セッション変数を設定する Web サイトがあります (セッション ID を定義する Cookie も設定すると思いますか? それがどのように機能するかわかりません)、すべてが完全に機能します。携帯電話で (Wi-Fi を使用して) ローミングしているときに見つけたのは、電話が Wi-Fi ネットワークを切り替えるたびに、そのウィンドウ/タブを閉じて再度開くまで、ブラウザーがセッションにアクセスできないように見えることです。
私が読んだことから、次のことが当てはまります。明確にしてください。
ブラウザー ウィンドウを閉じると、セッション Cookie が破棄されるため、再度開くと、新しいセッション ID に関連付けられた新しい Cookie が作成されます。したがって、セッションが再び適切に機能することを許可しますか?
ネットワークが切り替えられると、サーバーは新しいセッション ID を作成しますが、ブラウザー ウィンドウが閉じられていないため、古いセッション Cookie は破棄されず、ブラウザーは期限切れのセッション ID (古いセッション Cookie含む)?これが本当かどうかはわかりません。私はこれについて途方もない数のページを読みましたが、具体的なものは何も見つかりません. しかし、これは私が得る印象です。私はそれについて非常に多くの警告を見たので、
session_regenerate_id()
それを使用することに非常に神経質になっています...
これに関する詳細、またはそれを修正する方法についてのヘルプは非常に役立ちます。もう途方に暮れています...
アップデート
ログインを容易にするために mypajamas スクリプトを使用しています。セッションは正常に作成されます。しかし、コードを調べたところ、$_SERVER['REMOTE_ADDR']
との$_SERVER['HTTP_USER_AGENT']
値にセッション変数が設定されている場所が見つかりました。次に、同じ IP 上の同じブラウザーの同じユーザーであることを確認するために相互参照されます。これは、マルチソース攻撃を防ぐために行われました (ハイジャックの可能性を低くします)。問題は、モバイル ブラウザーまたは動的 IP を使用している場合に、IP が確実に変更される可能性があり、認証が失敗することです。
私はこれを理解できなかったとは信じられません.セッションIDの変更に関する問題を探すのに何時間も費やしました.
うまくいけば、将来同様の問題を抱えている人に役立ちます。そして、この投稿を読んだすべての人に心から感謝します。コメントでのあなたのガイダンスは、間違いなくこれをトラブルシューティングするのに役立ちました.
編集されたコード
class.mypajamas.php
から:
function check_ipau() { // user visits again... but is it really him? check values set above (by get_session())
if( $_SESSION['auth'.$this->_unique_id]['ip'] == $_SERVER['REMOTE_ADDR']
&& $_SESSION['auth'.$this->_unique_id]['ua'] == $_SERVER['HTTP_USER_AGENT']) {
// session data is correct -> user did not "change" ip-address or user agent (aka; hijack is unlikely)
return true;
}
else {
return false;
}
}
に:
function check_ipau() { // user visits again... but is it really him? check values set above (by get_session())
/*if( $_SESSION['auth'.$this->_unique_id]['ip'] == $_SERVER['REMOTE_ADDR']
&& $_SESSION['auth'.$this->_unique_id]['ua'] == $_SERVER['HTTP_USER_AGENT']) {
// session data is correct -> user did not "change" ip-address or user agent (aka; hijack is unlikely)
*/
return true;
/*
}
else {
return false;
}*/
}