なぜ、いつsession_regenerate_id()
PHPで関数を使用する必要がありますか?を使用した後は常に使用する必要がありsession_start()
ますか?セッションの固定を防ぐためにそれを使用する必要があると読みましたが、これが唯一の理由ですか?
なぜ、いつsession_regenerate_id()
PHPで関数を使用する必要がありますか?を使用した後は常に使用する必要がありsession_start()
ますか?セッションの固定を防ぐためにそれを使用する必要があると読みましたが、これが唯一の理由ですか?
回答:
session_regenerate_id()
?関数名が示すように、現在のセッションIDを新しいものに置き換え、現在のセッション情報を保持する関数です。
これは主にセッション固定攻撃を防ぐのに役立ちます。セッション固定攻撃とは、悪意のあるユーザーがシステムの脆弱性を悪用して、別のユーザーのセッションID(SID)を固定(設定)しようとする攻撃です。そうすることで、元のユーザーとして完全なアクセスを取得し、認証が必要なタスクを実行できるようになります。
このような攻撃を防ぐには、ユーザーがsession_regenerate_id()
サインインに成功したとき(またはXリクエストごとに)に新しいセッションIDを割り当てます。これで、彼だけがセッションIDを取得し、古い(固定された)セッションIDは無効になります。
session_regenerate_id()
ですか?symbeceanが以下のコメントで指摘しているように、セッションIDは、認証状態のすべての遷移で、認証遷移でのみ変更する必要があります。
参考文献:
セッションハイジャック とセッション固定session_regenerate_id()
を停止するには、を使用する必要があります。
セッションハイジャックとは、セッションCookieを盗むことです。これは、ローカルネットワークを他のコンピューターと共有するときに最も簡単に実現できます。たとえばスターバックスで。例...セッションYのユーザーがスターバックスでジェームズのWebサイトを閲覧しています。私はラテをすすりながら、彼らのネットワークトラフィックを聞いています。JamesのWebサイトのセッションYのCookieをユーザーに取得し、それらを使用するようにブラウザーを設定します。ジェームズのサイトにアクセスすると、ジェームズのサイトにアクセスします。
このウェブページから:
セッション固定は、ユーザーのセッションIDを明示的な値に強制する攻撃手法です。ターゲットWebサイトの機能に応じて、セッションID値を「修正」するためにいくつかの手法を利用できます。これらの手法は、クロスサイトスクリプティングの悪用から、以前に作成されたHTTPリクエストでWebサイトにペパリングするまでの範囲に及びます。ユーザーのセッションIDが修正されると、攻撃者はそのユーザーがログインするのを待ちます。ユーザーがそうすると、攻撃者は事前定義されたセッションID値を使用して、同じオンラインIDを装います。
いつ使用するか
ユーザーがサイトのセキュリティまたはプライバシーポリシーを危険にさらす可能性がある重要な入力(パスワード、資格情報の変更、パスワードを忘れたなど)を編集または更新しているとき。
以下も参照してください。
セッション中毒の問題はかなりよくカバーされていると思います。
「いつこれを使うべきですか?」部分では、ステップバックして、アプリケーションがセッションで何をしているかを検討することが重要です。または、別の言い方をすれば、これは答える必要のある重要なセキュリティの質問です
もし誰かがこのセッションを手に入れたら、彼らは何を得るでしょうか?
それ以外の場合は匿名のデータ(ユーザーがサイトにアクセスし、それを使用して訪問を追跡する)を追跡するだけであれば、セッションを再生成する理由はほとんどありません。ハイジャック犯は、そのセッションをつかんで何の価値も得ません。
ただし、多くのサイトはログインを提供しています。ログインは多くのことを変更します。自分のプロフィールにアクセスできます。設定を変更できます。そのため、特に通常のユーザーと管理者ユーザーがすべてセッションを使用してログインを管理している場合は、ハイジャッカーが私のアカウントにアクセスすることを望む場合があります。そのため、人々が私のサイトにアクセスしてログインすると、セッションが再生成されます。これにより、新たにログインしたユーザーがハイジャックされる可能性が低くなるという追加のセキュリティレイヤーが追加されます。
重要なデータをセッションに追加するときはいつでも、セッションIDの再生成を検討する必要があります。固定に対してアプリケーションを強化する必要がある場合は、ランダムな再生成が役立ちますが、すべてのリクエストで再生成することはありません。デフォルトでは、PHPはセッションをローカルディスク上のファイルに保存します。比較的小さな攻撃ベクトルを軽減するために、大量のディスクI / Oを追加しています。本当により多くのセキュリティが必要な場合は、定期的に再生成するのではなく完全なHTTPSを使用することをお勧めします(HTTPSを使用すると、修正が非常に困難になります)。
session_regenerate_id
ですか?セッションの固定を防ぐために使用してください。
session_regenerate_id
ですか?認証状態が変化するときはいつでも、それは主にログインとログアウトです。
ボブは公共のコンピューターの前に座って、stackoverflow.comを閲覧することで、そこで新しいセッションを開きます。セッションIDはcookieに保存されます(httpOnly
JavaScriptを介したアクセスを防止するフラグ付き)。スタックオーバーフローでHTTPSが常に有効になっていsecure
て、Cookieにフラグが設定されているとしましょう。
どうすれば今セッションを盗むことができますか?
ボブはセッションIDを書き留めます。彼はブラウザーを閉じずにコンピューターを離れます。これで、アリスがこのコンピューターにアクセスし、スタックオーバーフローが既に読み込まれていることを確認します。彼女は今ログインします。
これで、を使用する段階になりましたsession_regenerate_id
。ログイン中にここで新しいセッションIDを作成しない場合、ボブは書き留めた前のセッションを使用してアリスのセッションにアクセスし、今はアリスとしてログインすることができます。
session_regenerate_id()
発行されるまで、アリスはボブスアカウントにアクセスできますか?そうですか?
セキュリティを強化するために使用できます。
このようにして、1回限りのセッションIDを作成します。
あなたのユーザーセッションIDが= 3であるとしましょう
一部のハッカーはクライアントをハッキングして、そのsession_idを取得しました。したがって、ハッカーはそのCookieを使用してセッションを使用できます。
次のようなコードがある場合
session_start();
session_regenerate_id();
あなたは彼らがあなたのウェブサイトを使うたびに彼らのセッションを変えることができます。
今ハッカーはセッションID = 3を取得します
しかし、あなたは彼がそれを使用した後でセッションを変更しました。
user have sessionid = 4 // auth
ハッカーはsession = 3 // nullを持っています
しかし、再生成メソッドを使用していて、クライアントがWebサイトにログインし、ブラウザを閉じるか非アクティブであると言うことができるという少しのポイントがあります。クライアントにはsessionid = 4があり、ハッカーがその部分でCookieを取得した場合、同じセッションIDを持ちます。
この方法で上記で説明したように、クライアントを一方向のデータ盗聴から保護することができますが、この問題を完全に解決することはできません。
しかし、SSL encを使用すれば、はるかに安全です。
悪い英語でごめんなさい。
簡単な使用例:
// User visits a webshop
$shopcart = new Cart();
セッションが開始され、データベースにエントリが作成されます。ユーザーのショッピングカートは、セッションIDで識別されます。
// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);
追加された製品ごとに、私の買い物かごのテーブルにレコードが作成されます。セッションIDによっても識別されます。
// User saves cart in order to use it later
$shopcart->save();
ユーザーは自分のカートを保存することにしました。現在、彼のユーザーIDにアタッチされています。
// Regenerate session id for user to be able to make a new cart
session_regenerate_id();
セッションIDが再生成され、ユーザーは別のショップカートの作成をやり直すことができます。