2

登録フォームには、AJAX呼び出しを使用してユーザー名が使用可能かどうかを確認する機能があります。

とても簡単です

  • 私たちのサービスに電話をかける
  • データベースに対してユーザー名を確認する
  • ユーザー名のレコードが見つかった場合は、取得して返送します。それ以外の場合は、利用可能に返送します。

ユーザーが数秒間入力を停止すると、サービスへの呼び出しが実行されます。

ただし、私たちの問題は、攻撃者がサービスにブルートフォースの手段を使用して、すべてのユーザー名のリストをコンパイルする可能性があることです。

この種の「攻撃」を防ぐのに役立つ良い方法を知っている人はいますか?

私が考えることができたのは、事前にキャプチャを要求することだけでしたが、それは優れたユーザーエクスペリエンスではなく、フォームへの入力を延期する可能性があります。

それがまったく役に立った場合は、ASP.NET MVC、C#、SQLServerを使用しています。

どんな助けでも大歓迎です、ありがとう!

4

3 に答える 3

1

最善の方法は、ユーザーに特定の数のリクエストのみを許可するか、各リクエストに 0.5 ~ 1 秒の待機時間を追加することによって、レート制限することだと思います。これらのいずれかを実行すると、攻撃者が妥当な時間内に適切な数のユーザー名を列挙することがはるかに難しくなります。

ただし、アプリケーションを保護するより良い方法は、誰もが既にユーザーのリストを持っているかのようにアプリケーションを扱い、そこから作業することだと思います。攻撃者がすべてのユーザーを知っていると仮定すると、ブルート フォース攻撃からどのように保護しますか? パスワードの試行回数を制限する。10 分ごとに数回のパスワード試行のみを許可することで、アプリケーションのユーザーを実質的に保護できます。

個人的には、明らかでないパスワード (「password」や「qwerty」など) はすべて安全であるべきだと考えています。たとえば、「soccerfan」は安全なパスワードであるべきです。なんで?「サッカーファン」をすぐに推測するつもりはないからです。ブルートフォーサーの辞書ではおそらく 100 番目程度であり、その金額に近い金額でログインしようとしたと彼らが推測するまでに、彼らは禁止されるべきであり、ユーザーは通知されるべきです. (ちなみに、私は人々にそのようなパスワードを使うべきだと言っているわけではありません。複雑であればあるほどよいのです)。

于 2012-05-11T14:52:23.867 に答える
1

ajax リクエストが同じオリジンからのものであることを確認し、そこに何らかのスロットルを設定することもできます。リクエストに署名することもできます。

スロットリングとは、たとえば、1 つの IP アドレスで 1 日あたり最大 10 件のリクエストが許可されることを意味します。

于 2012-05-11T14:52:33.353 に答える
1

別のアプローチは、クライアントに数秒かかる何かを計算させることです。

サーバー側では、計算された値は非常に少ない CPU リソースで確認できます。また、クライアントによって計算された結果が正しい場合にのみ、リクエストが処理されます。

このようなアルゴリズムはトラップドア関数と呼ばれます

于 2012-05-11T14:58:25.003 に答える