4

私の質問は、セッション固定に関するこの要約についてです。

  • アリスは銀行http://unsafe.com/に口座を持っています。残念ながら、アリスはセキュリティに精通していません。

  • マロリーは銀行からアリスのお金を手に入れるために出かけています。

  • アリスはマロリーに対して妥当なレベルの信頼を持っており、マロリーが彼女に送るリンクにアクセスします。

    1. マロリーは、 http: //unsafe.com/が任意のセッション識別子を受け入れ、クエリ文字列からセッション識別子を受け入れ、セキュリティ検証がないと判断しました。したがって、http: //unsafe.com/は安全ではありません。
    2. マロリーはアリスに電子メールを送信します:「ねえ、これをチェックしてください、私たちの銀行にクールな新しいアカウント要約機能があります、http://unsafe.com/?SID=I_WILL_KNOW_THE_SID」。マロリーはSIDをI_WILL_KNOW_THE_SIDに固定しようとしています。
    3. アリスは興味があり、 http: //unsafe.com/?SID=I_WILL_KNOW_THE_SIDにアクセスします。通常のログオン画面が表示され、アリスがログオンします。
    4. マロリーはhttp://unsafe.com/?SID=I_WILL_KNOW_THE_SIDにアクセスし、アリスのアカウントに無制限にアクセスできるようになりました。(クレジット:RichieHindle)

質問:

Q1-サイトがセッション識別子を受け入れないようにする方法はありますか?

Q2-サイトで$_GET変数を使用しないので、クエリ文字列からセッション識別子を受け入れないようにする方法はありますか?

  • 注:SSLでphp 5.4.3を使用しており、session_regenerate_idも使用します。
4

4 に答える 4

5

彼の回答で言及されているオプションmartinstoeckliを設定することもできますが、これによってセッション固定が妨げられることはありません。セッション固定を攻撃するのは少し難しくなりますが、それを防ぐことはできません。

ServerBlokeが述べたように、ユーザーのログイン情報を確認した直後、認証が必要な最初のページを表示する前に、session_regenerate_id()を使用して、セッション固定を防ぎます。

攻撃者がセッション固定を悪用しにくくしても、セッション固定が妨げられることはありません。新しいセッションIDを生成する必要があります。

ますます多くの人々が公共の安全でない信頼できないwi-fiホットスポットを使用しています。セッションは空中から嗅ぐことができます。物理ネットワークでは、ネットワークから盗聴される可能性があります。また、man-in-the-middle攻撃を使用して、任意のURLにアクセスするように強制することもできます。したがって、攻撃者がURLを送信できない場合でも、セッション固定は依然として問題です。

セッション(およびパスワード)が盗聴される可能性があることを知っているので、セッションハイジャックを防ぐために必要な別のステップがあります。それがHTTPS(TLS / SSL)です。

認証が必要なすべての保護されたページには、HTTPS経由でのみアクセスする必要があります。したがって、ログインページ(ユーザーがユーザー名とパスワードを送信するページ)には、HTTPを介してアクセスする必要があります。同じスクリプトで、新しいセッションIDを再生成する必要があります。その後、セッションの残りのすべてのページにHTTP経由でアクセスして、新しいセッションIDを保護する必要があります。

擬似コードlogin.phpスクリプトの例を次に示します。

// Force SSL
if($_SERVER["HTTPS"] != "on") {
  die('Must login via HTTPS');
}

// Load the current sessionID
session_start();

// Validate the login information, being sure to escape the input
...
if (! $valid) {
  die('Invalid login');
}

// Start the new session ID to prevent session fixation
session_regenerate_id();

// Clear the old session
$_SESSION=array();

// Log them in
$_SESSION['user_id'] = $userID;
于 2012-05-23T14:15:11.383 に答える
3

session_regenerate_id()ユーザーがログインするたびに使用すると、セッション固定が防止されます。ユーザーがログインすると、固定されたセッションIDが再生成され、攻撃が停止します。

于 2012-05-23T07:44:26.563 に答える
2

質問1)アプリケーションでセッションが必要な場合は、何らかのセッションIDを送信する必要があります。アプリケーションがセッションを使用しない場合は、を呼び出す必要はなくsession_start()、ID(URLまたはCookieのどちらで送信されたか)は単に使用されません。

質問2)PHPを構成して、Cookieから排他的にセッションIDを受け入れ、URLからのIDを無視することができます(session.use_only_cookiesを参照)。その場合は、オプションsession.use_trans_sidが0に設定されていることも確認する必要があります(これがデフォルトです)。

于 2012-05-23T07:36:27.867 に答える
0

よくわかりませんが、これは本当に問題なのですか?

Q1。すでにセッションストレージ(データベースなど)にCOOKIEのGETから受け取ったSIDがあるかどうかを確認する必要があると思います。はいの場合-大丈夫、いいえの場合、サーバー側で新しいものを作成し、新しいSIDでhttpリダイレクトを実行します。

Q2。私はphp5.4を使用していませんが、次のコードが役立つと思います。

unset($_GET['sid'])

更新:一般的な修正は、バックエンドサーバーだけがSID識別子を生成できるということではないと思います。このためのユーザーの可能性はありません!

于 2012-05-23T07:12:01.707 に答える