10

私はWebフォームを持っており、PHPを使用しています。フォームを操作できることは承知しています(リプレイ攻撃または中間者攻撃と呼ばれると思います)。そこで、信頼性トークンを隠しフィールドとして使用したいと思います。

私が知っている脅威の可能性は次のとおりです。

  • 攻撃者が正当なユーザーのフォームを乗っ取る(これは中間者攻撃だと私は信じています)
  • 正当なユーザー自身が攻撃者です。彼はフォームを取得し、トークンを読み取りますが、それを使用して危険なデータを送信します(これはリプレイ攻撃だと思います)

質問に入る前に、これまでに言ったことが間違っている場合は訂正してください。私の理解に欠陥がある可能性があります。

今質問に:

  • このトークンを生成して、トークンのないフォームが拒否されるようにするためのベストプラクティスは何ですか(たとえば、ソルト?)。
  • トークンが再生されていないことを確認するために、人々は何をしますか。

コメントに基づく新しい小さな質問:

  • セッションハイジャックは中間者攻撃と同じですか?
4

4 に答える 4

5

タイトルでCSRFについて言及しましたが、質問では実際にはカバーしていませんでした。

詳細はオンラインで読むことができますが、CSRF は基本的に、正当なユーザーが無意識のうちにサイトに送信できるようにする攻撃です。たとえば、SO がそのような攻撃から保護されていない場合、この悪いフォームをクリックすると、SO プロファイル情報が変更されるフォームを作成できます。ここをクリック!!")。このフォームは、ブラウザーの Cookie を使用して SO でユーザーを認証し、プロファイルの更新を合法的に送信していることを SO に見せます。

これを防ぐには、次の 2 つのことを行う必要があります。

  • GET によって更新が発生しないようにします (たとえば、GET でクエリ パラメータを使用して、新しいステータスの更新をユーザーのプロファイルに投稿しないでください)。
  • すべての POST には、フォームが他のユーザーではなくサービスによって生成されたものであり、意図したユーザー向けであることを検証できる隠しフィールドが付随していることを確認してください。したがって、この非表示フィールドは、サーバーがフォームの html を送信するたびに生成する必要があり、そのセッションでそのユーザーに対して一意である必要があります。

その 2 番目の項目に代わる方法は、リファラーが常に自分のサイトか、または POST を期待するサイトであることを確認することです。HTTPS 以外のサイトではこれをお勧めしません。ブラウザやネットワーク ハードウェアによってはリファラーが取り除かれ、リファラーが存在するかどうかが常に信頼できるとは限らないためです。

于 2009-10-09T17:53:57.590 に答える
3

トークンの生成に使用される方法は、それほど重要ではありません。 重要なことは、トークンが一度だけ使用されることです。 ユーザーのセッションでユーザー用に生成されたトークンのリストを保持します。ユーザーがフォームを送信し、送信されたトークンがセッションにない場合は、フォームを拒否できます。

中間者からの保護は少し難しいです。私が見た一般的な手法は、ハッシュ関数に非表示のフォーム フィールドをすべて含めてトークンを生成し、既知の非表示フィールドに基づいてトークンを再生成することです。ただし、それは中間者の最終的なターゲットではない可能性のある隠しフィールドの操作から保護するだけです.

ユーザーがトークンを使用してフォームを正常に送信したら、セッションからトークンを削除して、その送信の再生失敗するようにします。ただし、必要なのは、ユーザーがフォームを再度要求して別のトークンを生成することだけです。その新しいトークンは、その後の自動攻撃で使用できます。 つまり、フォーム トークンは CSRF に対しては有効ですが、自動リプレイや中間者攻撃に対してはあまり効果的ではありません。

同様に、ユーザーがフォームで戻るボタンを使用する必要がないように、アプリケーションを調整する必要があります。送信に問題がある場合は、データが入力された状態でフォームをユーザーに返す必要があります。ユーザーがエラーを修正するために戻るボタンを押した場合、無効になったために送信が失敗します。トークン。

また、率直に言って、リクエストのリプレイや中間者攻撃を心配する必要があるときには、ユーザーの接続はすでに侵害されており、被害を軽減するためにできることはあまりないでしょう. SSL だけでも、MITM とリプレイに対して十分な保護レベルであり、それが心配な場合は、SSL で実行することになります...

于 2009-10-09T17:41:38.953 に答える
1

そのトークンを生成するために、私が使用している戦略はうまくいくようです。

  • Cookie をランダムな値 (通常のトリックを使用してサーバー上で生成) に設定し、必要に応じて期限切れになるように設定します。
  • フォームを含むページを提供する場合、値がこの Cookie の値と等しい隠しフィールドを埋め込みます。
  • 投稿を処理するときは、このフィールドが存在すること、および値がユーザーの Cookie と一致することを確認してください
于 2009-10-09T21:22:25.047 に答える
0

csrf-magic は CSRF トークンの優れたクラスであり、それらをページに自動的に配置します

http://csrf.htmlpurifier.org/

「csrf-magic は、PHP の出力バッファリング機能を使用して、ドキュメント内のフォームとスクリプトを動的に書き換えます。また、POST リクエストをインターセプトし、それらのトークンをチェックします (さまざまなアルゴリズムが使用されます。ノンスを生成するものもあれば、ユーザー固有のトークンを生成するものもあります)。つまり、フォームを備えた従来の Web サイトの場合、csrf-magic をアプリケーションにドロップすれば、それを忘れることができます!"

于 2014-06-17T04:53:37.467 に答える