0

私は Web のあらゆる場所を見てきましたが、SESSION 変数のニュアンスを明確にする必要があります。

セッション変数を設定する Web サイトがあります (セッション ID を定義する Cookie も設定すると思いますか? それがどのように機能するかわかりません)、すべてが完全に機能します。携帯電話で (Wi-Fi を使用して) ローミングしているときに見つけたのは、電話が Wi-Fi ネットワークを切り替えるたびに、そのウィンドウ/タブを閉じて再度開くまで、ブラウザーがセッションにアクセスできないように見えることです。

私が読んだことから、次のことが当てはまります。明確にしてください。

  1. ブラウザー ウィンドウを閉じると、セッション Cookie が破棄されるため、再度開くと、新しいセッション ID に関連付けられた新しい Cookie が作成されます。したがって、セッションが再び適切に機能することを許可しますか?

  2. ネットワークが切り替えられると、サーバーは新しいセッション 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;
    }*/
}
4

2 に答える 2

1

まず、セッション変数は実際には Cookie です。

1) セッション Cookie には有効期間があります。コードで有効期間が指定されていない場合、値はデフォルトで PHP 構成にあるものになります。phpinfo(); を実行します。秒単位の値であるsession.cookie_lifetimeを探します。値 0 は、ブラウザ ウィンドウを閉じると Cookie の有効期限が切れることを意味します。

2) コードでボイラープレート PHP セッション処理を使用している場合、問題がユーザーの IP アドレスの変更に関連している可能性は低いです。PHP セッションはクライアント IP を保存しません。接続先のアプリケーションが両方のネットワークで同じドメイン名/パブリック IP を持っている限り、問題はありません。(ユーザーが IP を変更すると PHP セッション Cookie が失敗する を参照)

クライアントの IP を格納する追加のセッション処理が存在する可能性がありますが、それは組み込み機能に基づいたものではなく、カスタム コードである必要があります。

(あなたの編集に基づいて、これは実際にそうでした。)

ネットワーク A とネットワーク B で同じ URL にアクセスしている場合、ネットワーク スイッチによってセッションが変更または影響を受ける理由はありません。ブラウザー ウィンドウを閉じる必要があり、セッション データがなくなっていることがわかった場合、問題は単純に、セッション Cookie の有効期間を 0 以外の値に設定することにあります。次の行を session_start() の前に配置します。

session_set_cookie_params(X);

X は、Cookie の有効期限が切れるまでの秒数です。session_start(); のすべてのインスタンスの前に前述のコードを呼び出す場合は注意してください。その場合、すべてのページがそのカウンターを 1 時間前にリセットするため、Cookie は実質的に期限切れになりません。

于 2012-05-30T20:58:27.817 に答える
-1

セッションはサーバー側のみです。残念ながら、別のネットワーク アドレスからアクセスしている場合、セッションは無効になります。

セッション値を保持したい場合は、独自の Cookie を作成することをお勧めします。これにより、誰かが一度認証された/有効なセッションを持っていたことを知ることができます。次に、最初にセッション値が設定されているかどうかを確認し、設定されていない場合はその Cookie を確認します。その Cookie が存在し、適切な値を持っている場合は、セッション値を Cookie の値に再設定できます (または、認証時に行うようにセッションを設定するだけです)。セッションも Cookie も存在しない場合、セッションは存在しないと見なされます。

于 2012-05-30T20:57:58.347 に答える