2

私はStackOverflowについて、セッションを適切に設定し、ハイジャックを防ぐ方法などについて調査していました。誰かが質問の1つに投稿した回答を見つけ、彼は次のコードを提供しました。

ユーザーがログインし、ユーザー名とパスワードが一致する場合

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] .''. $_SERVER['REMOTE_ADDR']);

保護されたページについて、ユーザーがログインしているかどうかを確認します。

if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] .''. $_SERVER['REMOTE_ADDR'])) {       
        session_destroy();
        header('Location: login.php');
        exit();     
    }

うまくいくようですが、私の質問は次のとおりです。これはどれほど安全か、これは良い方法ですか、それとも他の方法を試す必要がありますか?投稿には賛成票などがなかったので、それが良いかどうかはわかりません。

また、このセッションでユーザーに関する情報を取得する方法がわかりません..データベースに何かを保存する必要がありますか?

ありがとうございました!

4

3 に答える 3

3

このコードには2つの大きな問題があります。

1)正当な理由でIPアドレスが変更された。クライアントが企業ネットワークのようにロードバランサーの背後にいる場合、クライアントはWebアプリを使用できなくなります。

2)ユーザーエージェントをチェックすることは、というget変数を持つことによく似ています?is_hacker=false。ハッカーがセッションIDを持っている場合、ハッカーはユーザーエージェントを持っており、なりすましは簡単です。

さらに、プレーンテキストの比較を行う方が実際に安全であるのに、なぜmd5を使用するのかわかりません。ユーザーエージェントが最初であるため、攻撃者はmd5プレフィックス攻撃を使用して衝突を生成する可能性があり、そのためにREMOTE_ADDRチェックをバイパスします。(便利なmd5衝突攻撃はあまり頻繁に発生しませんが、これは楽しいです!)

このチェックを実施しても、CSRFとXSSを使用してセッションに影響を与えることができます。XSSを使用してCSRFトークンを読み取り、XHRを使用して攻撃者が望む要求を行うことができます。これはOWASPa9を軽減しようとしていると主張することもできますが、実際には、セッションIDを保護するためにSSLを使用する必要があります。

于 2011-08-21T17:32:31.417 に答える
0

私はRookのコメントに同意します、それはあなたのコードのかなり良い分析です。

PHPセッションを保護するために考慮すべきことはたくさんありますが、最新バージョンのPHPを使用すると、達成するのは難しくありません。考慮すべき点がいくつかあります。-セッションファイルがサーバーに保存される場所(主に共有サーバーの場合の問題)-クライアントとサーバー間を行き来するすべての機密データとCookieに安全な接続を使用する-クライアントのCookieセッションIDを安全にするためにできることを実行する-セッション変数に機密データを保存しない

データベースに保存することに関しては、ニーズによって異なりますが、おそらく必要ないでしょう。セッション変数にデータを保存することは、セキュリティのために問題ありません。(すでに述べたように)何も保存しないでください。そこに敏感。別の場所、おそらくデータベースから機密データを取得します。

PHPセッションのセキュリティについて詳しく知る必要がある場合は、このテーマに関する一連のブログ投稿があります

于 2013-01-14T15:17:17.923 に答える
0

これは良い方法のように見えますが、指紋ハッシュはクライアントデータによって生成され、なりすましの可能性があります。ログインフォームに使用する良い方法は、セッションに保存され、フォームを通過するランダムトークンを生成することです。トークンが検証されたら(または検証されていない場合)、1回だけ使用するために設定を解除する必要があります。

ユーザーがログインすると、セッションはユーザーIDも保存して、データベースに保存されているユーザー情報を取得する必要があります。

于 2011-08-21T17:46:40.613 に答える