0

これは私の現在のセッション管理です:

if(!isset($_SESSION["user"]["authenticated"]) || 
    !$_SESSION["user"]["authenticated"])
  redirect("login.php");

if($_SESSION["user"]["browserHash"] != md5($_SERVER["HTTP_USER_AGENT"]))
  redirect("logout.php?err=browser_mismatch");

if($_SESSION["user"]["IPHash"] != md5($_SERVER["REMOTE_ADDR"]))
  redirect("logout.php?err=ip_mismatch");

if(!isset($_SESSION["user"]["nonce"]) || 
  $_SESSION["user"]["nonce"] == $_COOKIE["SITE_nonce"])
{
  $nonce = md5(mt_rand() . time() . $_SERVER["REMOTE_ADDR"]);
  $_SESSION["user"]["nonce"] = $nonce;
  setcookie("SITE_nonce", $nonce, (60 * 15), "/path");
}
else
  redirect("logout.php?err=nonce_mismatch");

IPアドレスの最初の3つの部分のみを使用する計画でIPの問題を変更することを認識しています。しかし、私が懸念しているのは、攻撃者がヘッダーなどを盗聴できることです。じゃあ守られないよね?私が被害者のネットワーク内の攻撃者である場合、1 つの応答ヘッダーを盗聴した後、簡単な GET 要求を行うだけで、再生成されたノンスを取得できます。これを防ぐ方法は本当にありますか?

多すぎなければ、自分のアプローチについて洞察を得たいと思っていました。これはどのように回避できますか?私は何か大きなものを見逃していますか?

4

2 に答える 2

0

サーバー側でナンスを更新した後、ユーザーが新しいCookieを受信する前に、ユーザーが新しいリクエストを行った場合、ナンスを再作成するアプローチは失敗します。

これは、たとえば、ページの読み込みに失敗した後にユーザーがF5を押した場合、または新しいウィンドウ/タブで多くのリンクを開いた場合に発生します。

IPチェックのアイデアを捨ててください。IPアドレスは、さまざまな理由で完全に変更される可能性があります。たとえば、負荷分散プロキシやモバイルユーザーがローミングエリアを切り替えることを考えてみてください。

ユーザーエージェントの変更が検出され、パスワードを要求される可能性がありますが、ユーザーに再ログイン(および実行中の操作を再開)させることは、あまりユーザーフレンドリーではありません。

全体として、Cookie値に基づくセッションを使用して、セッションの盗用からシステムを保護しようとしています。これにはSSLが必要ですが、他のすべてのオプションはセキュリティの面でほとんど効果がありません。Cookieベースのセッショントークンは、セッションを管理するために現在受け入れられている方法であり、十分に安全であると見なされています。

また、CSRF攻撃はセッションハイジャック攻撃よりもはるかに危険であり、提案したもので攻撃を阻止することはできません。だから私のアドバイスは次のようになります:最初にその領域に焦点を合わせます。

于 2011-08-26T11:35:51.110 に答える
0

ヘッダーのスニッフィングを防ぐには、SSL/TLS 経由で接続を保護する必要があります。

于 2011-08-26T07:51:23.027 に答える