.NET TIPS

[ASP.NET AJAX]NoBotコントロールでページにボット対策機能を追加するには?[2.0、3.0、3.5、C#、VB]

山田 祥寛
2008/04/10

 NoBotコントロールは、ASP.NET AJAX Control Toolkit(以降、Control Toolkit)で提供されるコントロールの1つで、簡易なボット対策を実装するためのコントロールだ。ボット(Bot)とは、サイトへの不正なアクセスや投稿などを行うことを目的としたプログラムのことだ。もしも読者諸氏が自分でブログや掲示板などを立ち上げているならば、一度ならずボットによるスパム投稿を経験したことがあるかもしれない。このようなスパム投稿は、多くの場合、人間が手作業で行っているわけではなく、ボットによる自動的な投稿である。

 このようなスパム投稿を抑止するために比較的よく用いられているのが、CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart:キャプチャ)という手法だ。CAPTCHAは、フォームから情報を送信する際に、人間に画像上の文字を判読させ、これを投稿時に入力させる仕組みである。

CAPTCHA画像の例

 このような画像をプログラム的に読み込むことは困難であるので、これを正しく判読できていれば、投稿者は(ボットではなく)人間であると見なすわけだ。これはボット対策として(完全ではないものの)極めて有効な方法であるが、ユーザビリティという観点からは問題もある。

 というのも、投稿の都度、意味のない文字列を判読/入力しなければならないのは、善意のユーザーにとっては苦痛であるだけだし、そもそも視覚障害のあるユーザーにはこのようなサイトを利用することができないという問題もある。

 そこで登場するのが、NoBotコントロールなのだ。NoBotコントロールは、CAPTCHAほどには確実ではないものの、ユーザーの手を煩わせないという意味でよりシンプルなボット対策の仕組みを提供する。具体的には、NoBotコントロールで提供されているプロパティを見てみるのが早いだろう。

プロパティ 概要
ResponseMinimumDelaySeconds 最小のポストバック間隔(秒)
CutoffWindowSeconds 同一のIPアドレスから送信されるポストバックを追跡する時間間隔(秒)
CutoffMaximumInstances CutoffWindowSecondsプロパティで指定された時間内で、単一のIPアドレスに許可される最大ポストバック数
NoBotコントロールの主なプロパティ

 このように、NoBotコントロールでは「ポストバック間の時間間隔」や「同じIPアドレスからの単位時間当たりのリクエスト数」を監視し、ある閾値(いきち:プロパティで設定した値)を超えたところで、該当するリクエストをボットによるものと判断するわけだ。繰り返しであるが、これは必ずしも確実な判断ではないかもしれない。

 しかし、(例えば)人間が5秒の間に繰り返しポストバックを行うことは通常考えにくいし、ユーザーの手間を省くという点はその不確実性を補って余りあるメリットだろう。もちろん、設定によっては人間による正常な操作を妨げる可能性もないではないが、それほどの確実性を求めないサイトであれば、まずはNoBotコントロールの利用を検討してみてもよいだろう。

 やや前置きが長くなってしまったが、それでは具体的にNoBotコントロールを利用したサンプルを作成してみよう。ここでは、フォームから5秒以内に続けて値を送信した場合にはエラーを出力するサンプルを紹介する。

続けてフォーム送信を行った場合はエラーを表示

 なお、本サンプルを動作させるに当たっては、「TIPS:[ASP.NET AJAX]ASP.NET AJAX Control Toolkitを利用するには?」で紹介した手順に従って、Control Toolkitを利用可能な状態にしておく必要がある。

1. 新規のWebフォームを作成する

 新規のWebフォーム(NoBot.aspx)を作成したら、フォーム・デザイナから以下の画面の要領でサーバ・コントロールを配置する。

NoBot.aspxのフォーム・レイアウト
フォーム上に配置するコントロールと、そのプロパティの設定内容は以下のとおり。
コントロール(ID値) プロパティ 設定値
ToolkitScriptManager(manager*1
TextBox(txtComm) Columns 50
Button(btnComm) Text コメント
Label(lblBot) ForeColor Red
Text △(ブランク)
NoBot(bot) ResponseMinimumDelaySeconds 5
*1 ToolkitScriptManagerコントロールは、Control Toolkitを利用する場合に必ず必要となるコントロールである。詳細については、「TIPS:[ASP.NET AJAX]AlwaysVisibleControlコントロールで常時表示されるパネルを定義するには?」を参照してほしい。

2. ボタン・クリック時のイベント・ハンドラを定義する

 あとは、ボタン・クリック時に行うべきNoBotコントロールによる判定処理を定義するだけだ。

protected void btnComm_Click(Object sender, System.EventArgs e) {

  NoBotState bstate;

  // リクエストがボットによるものであるかどうかを判定
  if (!bot.IsValid(out bstate)) {
    // ボットと判定された場合はエラーを表示
    lblBot.Text = "NoBotエラー:" + bstate.ToString();
  } else {
    lblBot.Text = "";
  }
}
Protected Sub btnComm_Click(ByVal sender As Object, ByVal e As System.EventArgs)

  Dim bstate As NoBotState

  ' リクエストがボットによるものであるかどうかを判定
  If Not bot.IsValid(bstate) Then
    ' ボットと判定された場合はエラーを表示
    lblBot.Text = "NoBotエラー:" & bstate.ToString()
  Else
    lblBot.Text = ""
  End If
End Sub
ボタン・クリック時に行うべき判定処理のコード(NoBot.aspx)(上:C#、下:VB)

 リクエストがボットによるものであるかどうかを判定するのは、NoBot.IsValidプロパティの役割だ。IsValidプロパティは判定結果(ステータス情報)をパラメータに指定されたNoBotStateオブジェクトに格納する。ここでは、リクエストがボットとして判定された場合に、ステータス情報をそのまま文字列に変換したものをLabelコントロール上に表示するものとする。

 以上を理解したら、作成したサンプルを実行してみよう。[コメント]ボタンを5秒以内に繰り返しクリックしたとき、本稿冒頭の画面のようにエラー・メッセージが表示されればNoBotコントロールは正しく動作している。End of Article

利用可能バージョン:.NET Framework 2.0
利用可能バージョン:.NET Framework 3.0
利用可能バージョン:.NET Framework 3.5
カテゴリ:Webフォーム 処理対象:ASP.NET AJAX
使用ライブラリ:NoBotコントロール
関連TIPS:[ASP.NET AJAX]ASP.NET AJAX Control Toolkitを利用するには?
関連TIPS:[ASP.NET AJAX]AlwaysVisibleControlコントロールで常時表示されるパネルを定義するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET AJAX]ASP.NET AJAX Control Toolkitを利用するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間