セッションハイジャックを防ぐために、ユーザーエージェントとIPアドレス
の変数に基づいて、各ユーザーに特定のCookie名を割り当てようとしました。
次の関数を使用して、セッションIDを保持するセッションCookie名を生成しました。
static function getSessionName(){
$id= @md5(base64_encode(self::$secretToken.$_SERVER["HTTP_USER_AGENT"].$_SERVER["REMOTE_ADDR"]));
while(is_numeric($id{0})){
$id = substr($id, 1).$id{0};
}
return $id;
}
これは、私のWebサイトにアクセスするすべてのユーザーが、異なるセッションCookie名を持つことを意味します。ハイジャック犯が自分のユーザーエージェントを被害者のユーザーエージェントに変更しない限り、他人のCookieを使用することをブロックします。ユーザーのインターネットモデム、ルーター、NATなどを使用するなど、被害者のIPアドレスを使用してオンラインで表示しようとします。
例を使って説明しましょう。したがって、2人のユーザーが同じブラウザを使用し、同じIPアドレスから接続する場合、同じCookie名を取得します(f5e30acc605e938b097dee73c0272470と想定)。
これで、スクリプトはこれら2つのクライアントでf5e30acc605e938b097dee73c0272470という名前のCookie内のセッションIDを探します。この状態では、クライアントの1つが他のCookieを乗っ取ることができます。同じIP、同じユーザーエージェント、そして同じCookie名!
この方法は良いですが、完全に安全ではありません。ユーザーエージェントの変更はそれほど難しくありません。被害者とハイジャック犯は、コフェネットやパブリックホットスポットなどのパブリックネットワークから接続する場合、同じIPアドレスを持っている可能性があります。
特に「RememberMe?」を使用する場合は、攻撃者がそうすることを拒否することが重要です。長期的なセッションCookieを生成するオプション。
誰かがこの問題について提案がありますか?
私が調査したところ、解決策の1つはSSLと安全なCookieを使用することでした。しかし、SSLを使用しないソリューションを探しています。