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
情報を印刷することを期待します。からの情報はありませんが、からの情報は含まれていません。INFO2
INFO1
INFO1
INFO2
私は非常に、非常に一貫性のない結果session_regenerate_id
とリダイレクトを持っています。Set-Cookie
そのヘッダーを手動で送信するのは大変なことのようですが、送信しなかったとしてsession_regenerate_id(TRUE)
も、とにかく古いセッションIDを無効にする必要があります。そのため、ブラウザが何らかの理由で新しいセッションIDを取得しなかったとしても、表示されません。古いセッションが無効化されたため、セッション内の情報。
他の誰かがこの種の問題を経験したことがありますか?これらの問題を回避する良い方法はありますか?