セッション ハイジャックに関する記事を読んでいるときに、Cookie に保存されているセッション ID の値を暗号化すると便利だということを知りました。
私の知る限り、 を呼び出してセッションを開始するとsession_start()
、PHP はセッション ID 値を Cookie で暗号化しません。
セッション ID 値を暗号化し、それを使用してセッションを初期化するにはどうすればよいですか?
セッション ハイジャックに関する記事を読んでいるときに、Cookie に保存されているセッション ID の値を暗号化すると便利だということを知りました。
私の知る限り、 を呼び出してセッションを開始するとsession_start()
、PHP はセッション ID 値を Cookie で暗号化しません。
セッション ID 値を暗号化し、それを使用してセッションを初期化するにはどうすればよいですか?
暗号化は役に立ちません。いずれにせよ、セッション Cookie はただのマジック ナンバーです。暗号化するということは、ハイジャックする別のマジック ナンバーがあるということです。念頭に置いているハイジャックのシナリオに応じて、他にも可能な緩和策があります。たとえば、セッションを単一の IP に制限できます。ただし、ワイヤレス ポイント間の切り替えなど、いくつかの問題が発生します。
セッション ID がランダムであること (つまり、誰かが自分のセッション ID を使用して別の人のセッション ID を推測できないようにすること) がより重要です。本当の危険は、誰かが別のユーザーのセッション ID を手に入れることです。それらを本当にランダムに保つ限り、暗号化する理由もユーティリティもありません
セッション Cookie が GUID であると仮定すると、暗号化しても意味がありません。疑似ランダム文字列を別の文字列に置き換えるだけです。
残念ながら、セッション ID を暗号化してもセキュリティはあまり向上しません。攻撃者は暗号化されたフォームを使用できるからです (いずれにせよ、攻撃者には暗号化されたフォームしか表示されません)。
これが防止できる唯一のことは、誰かに ?PHPSESSID=foo を含むリンクを送信して、PHP にそのセッションを作成させるトリックです。暗号化と検証を使用することでこれを防ぐことができますが、URL でのセッション ID 転送を完全にオフにする必要があります。
このスクリプトを作成し、Web ブラウザーからアクセスして、Cookie を確認します。
<?php
session_start();
?>
あなたはおそらくこのようなものを見るでしょう
Site Cookie Value
mysite.com PHPSESSID 6fktilab3hldc5277r94qh2204
素敵な一意の ID を生成する場合、PHP はうまく機能します。これを暗号化しても意味がありません。
(ログインしている) ユーザーを検証するために、1 つの Cookie または項目だけに依存しないことは、常に良い考えです。前述のように、IP も保存して確認することをお勧めします。良い追加は、USER_AGENT を保存することです。
アプリケーションがオープンソースである場合、ハッカーは検証対象を簡単に特定できるため、セッション ID だけでも問題ないことに注意してください。
Cookie を使用して機密情報を保存する場合、Cookie データを暗号化することは理にかなっています。サーバーのみが読み取る(復号化する)必要があります。
ハッカーはその暗号化されたセッション ID を使用して被害者になりすますことができるため、セッション ID を暗号化する必要はありません。
セッション ID は比較的推測しにくいため、実際には問題になりません。
これに関連して、攻撃に対抗するためにできることがいくつかあります。
他にもかなりのものがあります。これらの問題については、 Rails ガイドを読むことを常にお勧めします。これは、既知の問題とその対策について非常に理解しやすい説明を提供します。これらはすべて、PHP コードにも同様に適用できます。