web-dev-qa-db-ja.com

セッション識別ハッシュ-より安全で堅牢にする方法

私はPHPセッションを処理し、サーバーの通常のファイルの代わりにDBに保存するクラスを書きました、あなたはそれを My Session Handler Class)で見つけることができます

その投稿では、@ AnotherGuyという名前のユーザーが、私の_Session Fingerprinting methods_に関するセキュリティ上の懸念/欠陥を提起しています。これは私には有効であると思われ、以下に引用します。

最後に私が話します。最初に言ったように、私はセキュリティの専門家ではありませんが、あなたの指紋ソリューションは怪しいようです。あなたのサイトを使用している同じ会社の2人の異なるユーザーを想像してみてください。同社はIPアドレスを同じにするロードバランサーを使用しています。すべての会社のブラウザ/クライアントが同じである場合、これらの2人の指紋は同一になります。 HTTP_X_FORWARDED_FORヘッダーをチェックしている場合でも、ヘッダーの送信をロードバランサーに依存することはできません。フィンガープリントのアイデアを使用してセッションを適切に検出する方法は説明できません。

彼は関数getFingerPrint()_isSuspicious($fp)を参照していました

_    /**
    * [_getFingerPrint generates session fingerprints md5(USER AGENT + SECURE SESSION + IP ADDRESS)]
    * @return [strings] [encryted session info fingerprint]
    */
    private function _getFingerPrint()
    {
        return md5($this->_user_agent.self::SECURE_SESSION . $this->_ip_address);
    }

    /**
    * [_isSuspicious check for possible session Hijack attempt, by comaparing encrypted user system specific values against exoisting records ]
    * @param  [string]  $fp [session fingerprint]
    * @return boolean
    */
    private function _isSuspicious($fp)
    {
        return ($fp != $this->_getFingerPrint()) ? True : False;
    }
_

私はgetFingerPrint()を使用して、ユーザーエージェント+ salt + ipアドレスを使用してセッションハッシュを生成し、_isSuspicious()は、生成されたフィンガープリントをDatabaseに保存されているフィンガープリントと照合してチェックしています。セキュリティリスクは同じ程度ですが、ユーザーがローカルネットワーク(LANなど)にいて、同じブラウザエージェントを使用している場合、_session hijacking_のセキュリティリスクに耐えられるようです。

また、以下の関数を使用してユーザーのIPアドレスを取得しています。

_/**
     * [_getRealIpAddr Get the IP address of the user]
     * @return [strings] [IP address of the client]
    */

    private function _getRealIpAddr()
    {
      if (!empty($_SERVER['HTTP_CLIENT_IP']))
      {
        /*check ip from share internet*/
        $ip     =   $_SERVER['HTTP_CLIENT_IP'];
      }
      elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
      {
        /*to check ip is pass from proxy*/
        $ip     =   $_SERVER['HTTP_X_FORWARDED_FOR'];
      }
      else
      {
        $ip     =   $_SERVER['REMOTE_ADDR'];
      }

      return $ip;
    }
_

ユーザーが同じネットワークプールを共有しているときに、このセッションハッシュをより堅牢にする方法を教えてください。最初の解決策は、COOKIE(ランダムなソルト/数値など)をハッシュに追加することです。これは、ユーザー固有のシステムに固有であり、同じユーザーエージェントとIPアドレスを持つにもかかわらず、2人のユーザーは異なります。ローカルCookie。誰か他のより良い解決策/オプション、またはこの状況を処理するための完全に異なる方法がありますか?

編集2:EVERCOOKIEの使用についてはどうですか[しかし、JavaScriptが無効になっている場合はどうなりますか?!

4
Dimag Kharab

多くのことは、それが何をしようとしているのか、およびセッション乗っ取りに関連するリスクに依存します。一般に、セッションが実際に正しいユーザーによって所有されていることを確認する必要がある場合は、ユーザー名やパスワードなどのチェックを追加します。

EFFは、ユーザーを追跡するためにブラウザーのフィンガープリントを作成する方法について少し取り組んでいます。この作業により、フィンガープリント技術をどのように向上させることができるかについて、いくつかのアイデア/ポインタが提供される可能性があります。

参照 PanoptiClick

1
Tim X