ボットと戦う (C#)

作成者: Christian Wenz

PDF のダウンロード

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

概要

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

手順

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

この方法にはいくつかの長所と短所がありますが、このチュートリアルでは説明を省略しています。 ただし、ASP.NET AJAX Control Toolkit には、同様のアプローチ NoBot を提供するコントロールがあります。 これは、CAPTCHA よりも克服するのは簡単で、非常に使いやすく、ほとんどのスパムの試みに打ち勝てば成功とみなされるブログのような Web サイトでは非常に良い結果を出しています。NoBot コントロールはこれを可能にします。

NoBot は、次の条件の少なくとも 1 つが満たされている場合、現在の ASP.NET Web form のポストバックを取得します。

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

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

  • ResponseMinimumDelaySeconds ポストバック間の最小秒数
  • CutoffWindowSeconds ある 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 はサーバー側で行われるため、これらの検証の結果をチェックする必要があります。 これは NoBotIsValid() メソッドを使用すると実行できます。 これには、NoBotState 型の引数が 1 つ (out パラメーター/ByRef パラメーターとして) 含まれます。 その文字列形式には、チェックに失敗したときの理由と、そうでない場合は 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>

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

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 のテストに失敗することになるため、このコントロールは賢く使用する必要があります。

This error message could have been caused by a bot

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