用語
- ユーザー:訪問者。
- クライアント:特定のマシンにインストールされた特定のWeb対応ソフトウェア。あなたのセッションを安全にする方法を理解するためにセッション
を理解
、あなたは最初のセッションがどのように機能するかを理解する必要があります。
はのは、コードのこの部分を見てみましょう:
session_start();
とすぐにあなたがいることを呼び出すと、PHPは(デフォルトで)PHPSESSID
と呼ばれるクッキーを探します。それが見つからない場合は、1を作成します。
PHPSESSID=h8p6eoh3djplmnum2f696e4vq3
を、それが見つかった場合、それはPHPSESSID
の値をとり、その後、対応するセッションをロードします。その値はsession_id
と呼ばれます。
これは、クライアントが知る唯一のものです。セッション変数に追加するものはすべてサーバー上にとどまり、決してクライアントに転送されません。 $_SESSION
の内容を変更すると、その変数は変更されません。あなたがそれを破壊するか、タイムアウトするまで、それは常に同じままです。したがって、クライアントがハッシュしたり、他の方法でクライアントがその情報を受け取ったり、送信したりすることがないので、$_SESSION
の内容を難読化しようとするのは役に立たない。
次に、新しいセッションの場合には、あなたは変数を設定します:
$_SESSION['user'] = 'someuser';
クライアントがその情報を見ることはありません。悪意のあるユーザが他のユーザのsession_id
を盗むとき
問題
セキュリティ上の問題が生じる可能性があります。何らかのチェックがなければ、彼はそのユーザーを偽装することが自由になります。クライアント(ユーザーではない)を一意に識別する方法を見つける必要があります。
1つの戦略(最も効果的)は、セッションを開始したクライアントのIPがセッションを使用している人のIPと同じであるかどうかを確認することです。
if(logging_in()) {
$_SESSION['user'] = 'someuser';
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
// The Check on subsequent load
if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
die('Session MAY have been hijacked');
}
その戦略の問題は、クライアントは、ユーザが動的IPを持っている(長時間のセッションで)ロードバランサを使用する場合、または、それが偽の警告をトリガすることです。
別の戦略は、クライアントのユーザーエージェントをチェックする必要:
if(logging_in()) {
$_SESSION['user'] = 'someuser';
$_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT'];
}
// The Check on subsequent load
if($_SESSION['agent'] != $_SERVER['HTTP_USER_AGENT']) {
die('Session MAY have been hijacked');
}
その戦略の欠点は、(いくつかは、ユーザーエージェントに追加されます)クライアントのアップグレードならば、それはブラウザのか、アドオンをインストールすることで、ユーザーエージェント文字列が変更され、誤ったアラートが発生します。
もう1つの戦略は、5つの要求ごとにsession_id
をローテーションすることです。そのようにして、理論的には、session_id
はハイジャックされるほど長く滞在しません。
if(logging_in()) {
$_SESSION['user'] = 'someuser';
$_SESSION['count'] = 5;
}
// The Check on subsequent load
if(($_SESSION['count'] -= 1) == 0) {
session_regenerate_id();
$_SESSION['count'] = 5;
}
これらの戦略をそれぞれ希望通りに組み合わせることはできますが、下側を組み合わせることもできます。
残念ながら、解決策はありません。あなたのsession_id
が侵害された場合、あなたはかなりお手伝いします。上記の戦略は、ストップギャップ対策にすぎません。
'has_logged_in'を保存する必要はありません。ユーザーをログアウトするときに' $ _SESSION = array(); 'を使うだけです。 –
SSLなしの場合 – Petah
SSLについて詳しく説明できますか? – Rain