ボットと戦う (C#)

作成者: Christian Wenz

PDF のダウンロード

自動ボットは、スパムを含む石膏 Web ログやその他の Web サイトを作成し、ユーザーの操作なしでコメント フォームを送信します。 ASP.NET AJAX Control Toolkit の NoBot コントロールは、これらのボットとの戦いに役立ちます。

概要

自動ボットは、スパムを含む石膏 Web ログやその他の Web サイトを作成し、ユーザーの操作なしでコメント フォームを送信します。 ASP.NET AJAX Control Toolkit の NoBot コントロールは、これらのボットとの戦いに役立ちます。

手順

ボットを倒す一般的なアプローチの 1 つは、CAPTCHA 完全に自動化されたパブリック チューリング テストを使用して、コンピューターと人間の区別を伝えることです。 チューリングテストはもともと、コミュニケーションパートナーが人間か機械かを判断する必要があるテストでした。 Web では、CAPTCHA は通常、歪んだ文字を含む画像で構成されます。 この考え方は、画像上の文字を読み取ることができるのは人間だけですが、OCR アルゴリズムは失敗します。

このアプローチにはいくつかの利点と欠点がありますが、これについては、このチュートリアルの範囲を超えています。 ただし、ASP.NET AJAX Control Toolkit には、次のようなアプローチを提供するコントロールがあります。 NoBot CAPTCHAよりも簡単に克服できますが、使用は非常に簡単で、ほとんどのスパム試行が失敗した NoBot 場合に成功と見なされるブログのようなウェブサイトでは非常によく料金が発生します。

NoBot これらの条件の少なくとも 1 つが満たされた場合、現在の ASP.NET Web フォームのポストバックをインターセプトします。

  • ブラウザーで JavaScript パズルの解決に失敗する (JavaScript が非アクティブ化された場合など)
  • ユーザーがフォームを高速に送信した
  • クライアント IP アドレスは、一定の期間にフォームを送信する頻度が高すぎます。

これらの条件をチェックするために、コントロールには次のNoBot属性が必要です (これらはすべて省略可能)。

  • ResponseMinimumDelaySeconds ポストバック間の最小秒数
  • CutoffWindowSeconds 1 つの IP からのポストバックがメジャーである時間間隔の長さ
  • CutoffMaximumInstances 時間間隔あたりの最大秒数

次のマークアップでは、ポストバックの間に少なくとも 2 秒が経過し、30 秒以内にポストバックが 5 つ以下であることを要求しています。

<ajaxToolkit:NoBot ID="nb" runat="server" CutoffMaximumInstances="5"
 CutoffWindowSeconds="30" ResponseMinimumDelaySeconds="2" />

その後、通常どおり、 をページに含め ScriptManager 、ASP.NET AJAX ライブラリが読み込まれ、Control Toolkit を使用できるようにします。

<asp:ScriptManager ID="asm" runat="server" />

ほとんどのチェックNoBotはサーバー側で行われるので、これらの検証の結果をチェックする必要があります。 これを行うには、 の IsValid() メソッドを呼び出NoBotします。 これには、 型NoBotStateの 1 つの引数 (パラメーター/ByRef パラメーターとしてout) があります。 その文字列表現には、チェックが失敗した理由がValid含まれます。それ以外の場合は 。 次のコードは、 の結果に従ってメッセージを NoBot出力します。

<script runat="server">
 void Page_Load()
 {
 if (Page.IsPostBack)
 {
 NoBotState state;
 if (!nb.IsValid(out state))
 {
 Label1.Text = "Data refused (" 
 + HttpUtility.HtmlEncode(state.ToString()) + ")";
 }
 else
 {
 Label1.Text = "Data entered.";
 }
 }
 }
</script>

最後に、送信するフォームと、メッセージを出力するための label 要素が必要です。これで完了です。

Your comment:
<asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"/><br />
<input type="submit" id="Submit1" runat="server" value="Submit Form" /><br />
<asp:Label ID="Label1" runat="server" />

このスクリプトを実行して JavaScript を非アクティブ化するか、最初の 2 秒以内にフォームを送信するか、30 秒以内に 7 回フォームを送信すると、エラー メッセージが表示されます。 ただし、このコントロールは慎重に使用します。JavaScript がアクティブ化されているユーザーは約 90 ~ 95% であるため、ユーザーの 5 ~ 10% は テストに失敗 NoBotします。

このエラー メッセージはボットによって発生した可能性があります

このエラー メッセージはボットによって発生している可能性があります (クリックするとフルサイズの画像が表示されます)