10

ブール値を含む PHP で Web サイトをコーディングしています$_SESSION['logged_in']。これはtrue、ユーザー名とパスワードの一致がデータベースに存在する場合に設定されます。

私はセッションにまったく慣れていないので、未登録の(または、さらに言えば登録済みの)ユーザーが、このブール値を に設定することでログインプロセスをバイパスできるかどうか疑問に思っていました.Cookieでtrue可能になる.

ユーザーがクライアント側からサーバー側の変数を操作する必要があることは理解していますが、私の質問は、これがどれほど簡単か、ユーザーがそのようなタスクをどのように達成するか、既知のエクスプロイトはありますか、そして何がこの種の攻撃を回避するためのベストプラクティス/予防策は?

4

4 に答える 4

16

良いニュースから始めましょう:$_SESSION配列は、デフォルトでは完全に見えず、クライアントから操作することもできません: サーバー上に存在し、クライアントに開かれていない実行環境でのみサーバー上に存在します。

話を元に戻します。PHP コードを「ほぼ正しい」ものにして、サーバーから見たクライアントとセッションの間にドアを開くのは非常に簡単です。これに加えて、クライアント セッション (Cookie を含む) を盗むことは非常に簡単です。

非常に効果的であることが証明されているいくつかの軽減策をお勧めします。

  • 「ログイン済み」の値を保存しないでください。代わりに「セッション Cookie」の値を保存し、Cookie をクライアントに設定します。クライアントの要求に応じて、 の行に沿って何かを作成します$loggedin=($_SESSION['cookie']==$_COOKIE['session'])。これにより、攻撃者は Cookie とセッション ID の両方を必要とします。
  • セッション Cookie を頻繁に更新します。間違った Cookie を使用すると、セッションが強制終了されます。ブラック ハットが Cookie とセッションを盗んだ場合、実際のユーザーが次にクリックすると、両方がログアウトされ、ログ可能なイベントが作成されます。
  • リクエストが JS からのものである場合は、単純な認証関数を作成することを考えてください。認証トークンを送信する代わりに、ソルトし、タイムスタンプをペッパーしてハッシュします。ソルト、タイムスタンプ、ハッシュを送信します。サーバーにタイムスタンプをチェックさせます。
于 2013-07-01T21:02:46.407 に答える
1

セッションのドメインで発生する最も一般的な問題は、セッション ハイジャックです。これは、セッションがセッション パラメータに関連付けられているためです。このパラメーターは、ユーザーがサーバーにリクエストを送信するたびに指定する必要があります。ご想像のとおり、誰かがパラメーターを推測または取得できる場合、セッションを「乗っ取る」ことができます。

編集: それに対するセキュリティ対策については、Eugen Reck の投稿を参照してください。

于 2013-07-01T21:06:00.623 に答える
1

コード以外の誰もがセッションで値を操作することはできません。誰かがそれを回避するには、サーバー上でコードを実行するか、コードまたはサーバーのセキュリティ ホールを悪用する (いずれにしてもセキュリティ エクスプロイト) 権限が必要です。ユーザーがそれを実行できる場合は、サーバー上で他のことを直接実行できるため、おそらくセッション値をいじる必要はありません。

于 2013-07-01T20:56:05.283 に答える
0

この攻撃が可能になる場所を確認できる唯一の方法は、コードに他のエクスプロイトがあるか、別の手段でサーバーにアクセスできるかどうかです。もちろん、彼らがあなたのサーバーにアクセスできる場合、彼らはあなたのデータベース、ソースコード、おそらくウェブログ、おそらくパスワードを含むすべての未加工のインターネットトラフィックにアクセスできます....

于 2013-07-01T20:57:00.027 に答える