0

奇妙に機能していると思われる次の基本的なログアウトスクリプトがあります。

<?php
session_start();

$_SESSION['customerState'] = array("abbr"=>"TX","full"=>"Texas");
$_SESSION['agent']['url'] = "jmarston4";

$fart = isset($_SESSION['customerState']) ? $_SESSION['customerState'] : array();
$url = isset($_SESSION['agent']['url']) ? $_SESSION['agent']['url'] : '';

$_SESSION = array();

if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

echo "Fart1: ";
print_r($fart);

session_destroy();

echo "<br>Fart2: ";
print_r($fart);

session_start();

echo "<br>Fart3: ";
print_r($fart);

$_SESSION['fart'] = $fart;

echo "<br>Fart4: ";
print_r($_SESSION['fart']);

#exit;

header('Location: https://'. $_SERVER['HTTP_HOST'] . '/' .$url);

このページは、リファラー URL ($url と記載) を使用してサイトのホームページ (index.php) にリダイレクトします。これは正常に機能します。テスト用に、index.php のすべてのコードのスクリーン ショットを次に示します。

http://imgur.com/EmkRAh0

の処理を許可するexit;と、次のように画面に出力されます。

Fart1: アレイ ( [abbr] => TX [full] => Texas )

Fart2: アレイ ( [abbr] => TX [full] => Texas )

Fart3: アレイ ( [abbr] => TX [full] => Texas )

Fart4: アレイ ( [abbr] => TX [full] => Texas )

(または視覚的に: http://imgur.com/A6WuRfx )

このスクリプト (logout.php) では、顧客のセッションから 1 つの SESSION 変数を保持し (100 以上の他の変数を手動で設定解除しないでください)、内部目的でホームページに戻すことができるようにします。これを行うために、スクリプトは次のことを行います。

  • SESSION 変数 'fart' を配列に設定します
  • 次に、SESSION 全体が破棄される前に、ローカル変数が SESSION 'fart' と等しくなるように設定されます。
  • セッションデータが消去されます
  • セッション Cookie が削除されます
  • セッションが破棄される
  • SESSION 'fart' が作成され、$fart 配列に戻されます
  • ページはホームページにリダイレクトされます。

質問

設計上、PHP SESSIONS はこのように動作することが期待されていますか? もしそうなら、そのユーザーセッション中に収集されたセッション情報の一部を維持しながら、どうすれば本質的にセッションを破棄できますか (ログアウトの目的など)。

注: SESSION 配列を使用しているため、GET 目的で URL を渡すことはここでは適用されません。

アップデートノート:

  • この質問のタイトルを「PHP セッションは仕様に従って動作していますか?」から変更しました。

  • これはすべてスクリプト自体で機能しますが、ホームページの $_SESSION['fart'] にアクセスしようとすると、設定されません。session_destroy()が呼び出された後を含め、いつでもページの SESSION 変数を設定、操作、または変更できます。たとえば、次のことをしたい場合:

    ... session_destroy()

    $_SESSION['eatmyshorts'] = "こんにちは!";

    echo $_SESSION['eatmyshorts']; // hello! が表示されます ....

    ただし、スクリプト (ページ) が終了すると、セッションに関連するものはすべて ($_SESSION['eatmyshorts']この場合でも、他のページでは使用できず、無視されます。

4

3 に答える 3

1

セッションを呼び出すsession_destroyと、まあ、破棄され、セッション データのサーバー側ストレージが削除されます。その後、viariable を操作し$_SESSIONても、実際のセッションに「バインド」されていないため、効果がありません (つまり、設定したデータは、スクリプトの終了時にセッション データ ストレージに書き込まれません)。

于 2013-08-21T20:23:32.527 に答える
1

を呼び出すsession_destroyと、保存されたセッション データが破棄されて空になり、呼び出される$_SESSION前のように「セッション状態」がリセットさsession_startれます。その状態では、データは$_SESSION実行時にのみ存在します。session_startafterを呼び出すsession_destroyと、セッション処理は、ランタイム内の最初のアクティブなセッションの場合とまったく同じように動作します。クライアント リクエストに構文的に有効なセッション ID が含まれている場合、このセッションにそれが使用されます。

これすべて期待どおりに機能します。

ただし、考慮していないのは、ID を含むセッションの Cookie を削除したときのセッションの動作です。クライアントのセッション ID を取り消すために Cookie を送信すると、クライアントは次のリクエストでセッション ID を送信せずsession_id、新しいセッション ID を生成するためです。新しいセッションなので$_SESSION空です。

現在のセッション ID を取り消して新しいセッション ID を生成する場合は、 と を使用session_regenerate_id(true)session_unsetます。

于 2013-08-21T21:20:32.150 に答える