3

PHPが非常に基本的なセッションセキュリティタイプのことを行うのに苦労しています。

  • 認証されていないコンテキストから認証されたコンテキストに切り替えるときに、新しいセッションIDを生成する必要があります
  • 認証されたコンテキストから認証されていないコンテキストに切り替えるときに、新しいセッションIDを生成する必要があります

私がやりたいのは、コンテキストを切り替えるときにセッションIDを再生成するだけでなく、それらのコンテキストを切り替えるときにすぐに何か(FLASHなど)をセッションに入れることです。これらの3つのページは、うまくいけば私の期待を明確にするはずです。

<?php
/* page1.php */
session_start();
# Just putting something in the session which I expect to
# not show up later
$_SESSION['INFO1'] = 'INFO1';
?>
<html>
<a href="page2.php">Page 2</a>
<?php print_r($_SESSION) ?>
</html>

ですから、このページが表示されると、表示されると思いますINFO1。私がここに戻ったときも、現れないことを期待していINFO2ます。セッションIDをまだ持っていない場合は、取得する予定です(持っています)。

<?php
# page2.php
session_destroy();
session_regenerate_id(TRUE);
$_SESSION['INFO2'] = 'From page 2';
session_write_close();
header('Location: page3.php');
exit;
?>

これはログアウト関数に最もよく似ています。に渡すTRUEことで既存のセッションを無効にしsession_regenerate_idます。また、(おそらく)新しいセッションに何かを入れました-これはFLASHのようなものかもしれません-「あなたは正常にログアウトしました。

#page3.php
<html>
<body>
<?php session_start(); ?>
<?php print_r($_SESSION); ?>
</body>
</html>

このページでは、次の2つのことが起こる思います。

  • からのリダイレクトによりpage2.php、新しいセッションID cookieが送信されたはずです(送信されませんでした)
  • からではなく、からprint_r情報を印刷することを期待します。からの情報はありませんが、からの情報は含まれていません。INFO2INFO1INFO1INFO2

私は非常に、非常に一貫性のない結果session_regenerate_idとリダイレクトを持っています。Set-Cookieそのヘッダーを手動で送信するのは大変なことのようですが、送信しなかったとしてsession_regenerate_id(TRUE)も、とにかく古いセッションIDを無効にする必要があります。そのため、ブラウザが何らかの理由で新しいセッションIDを取得しなかったとしても、表示されません。古いセッションが無効化されたため、セッション内の情報。

他の誰かがこの種の問題を経験したことがありますか?これらの問題を回避する良い方法はありますか?

4

1 に答える 1

5

のドキュメントに基づくと、セッションsession_regenerate_idの内容は常に保持されているようです。引数を渡していますが、それはディスク上の実際のセッションファイルを削除するだけです。そこに保存されている値は保持され、新しいセッションに書き込まれます。TRUE$_SESSION

したがって、おそらく手動で消去します。

$_SESSION = array();

ただし、新しいCookieが表示されない理由はわかりません。どこでチェックしましたか、何を見ましたか?

session_start編集:以下のコメントでOPによって明らかにされたように、問題は、最初のセッションをロードするためにpage2が呼び出されなかったことであるように見えます。これにより、次のようになります。

<?php
    session_start();    # Load the old session
    session_destroy();  # Nuke it
    session_unset();    # Delete its contents
    session_start();    # Create a new session
    session_regenerate_id(TRUE);  # Ensure it has a new id
    $_SESSION['FLASH'] = "You've been logged out";
    session_write_close();  # Convince it to write
    header('Location: index.php');
?>

これが最小限かどうかはわかりません。どれだけ削除できるかを理解することは、読者の練習問題として残されています。

于 2013-01-15T01:26:24.007 に答える