-1

CSRFを防ぐ方法の1つは、フォームでトークンを使用することです。多くの記事を読んだ後、私はステップが通常これらの線に沿っていることを理解しました:

  1. 暗号化されたトークン値を生成し、それをセッションに保存し、フォームの非表示フィールドにトークン値を設定します。
  2. フォーム処理ページで、非表示フィールドのトークン値とセッション値を次のように比較します。$ _POST ['token'] == $ _SESSION ['token']

私の質問は、なぜトークン値を暗号化する必要があるのですか?私がGETメソッドを使用していて、攻撃者が1から1000までの単純な整数値を使用することを知っていると仮定します。攻撃者が画像を使用してリクエストを偽造する場合、攻撃者は1000枚の画像を送信する必要があります。要求をブルートフォースするために..正しいですか?またはこれを行う他の方法はありますか?

また、POSTメソッドだけを使用するだけではCSRFリクエストを防ぐのに十分ではないことを読みました。したがって、私の2番目の質問は、これが当てはまる場合、POSTメソッドを使用している場合、攻撃者はどのようにして偽造されたリクエストを正常に作成できるかということです。

4

1 に答える 1

0

多くの自動化されたプロセスとアプリケーションを使用する攻撃者にとって、1000 回のブルート フォース リクエストを実行するのは、ほんの数分の問題です。

したがって、トークンを次のように設定することをお勧めします。

$token = md5(uniqid(rand(), true));

これにより、暗号化はまったく必要ありませんが、常に一意のランダムトークンになります-難読化が追加されるだけです:-)。お好みの暗号化方法を使用してくださいsha1()。最近だけ使用する人もいれば、さらに先に進む人もいます。しかし、これはペンタゴンのセーフゾーンではなく、ブルートフォース攻撃を行うことを容​​易に推測できないランダムなトークンにすぎません。

実際、POST メソッドを使用するだけでは十分ではありません。Firefox に拡張機能をインストールしました。これにより、GET パラメーターを使用して URL を取得し、それを POST 要求に変換できます。コピー+貼り付け+クリックで簡単。

また、トークンを非表示フィールドに設定する必要はありません。GET からトークンを読み取り、POST 配列からフォーム データを読み取るときに、フォーム アクション URL の GET パラメータとして使用することもできます...

于 2013-01-16T15:37:34.827 に答える