共用方式為


對抗 Bot (C#)

作者 :擷取 Wenz

下載 PDF

自動化 Bot 會以垃圾郵件填滿 Weblog 和其他網站,提交批註表單而不需任何使用者互動。 ASP.NET AJAX Control Toolkit 中的 NoBot 控制項可協助對抗這些 Bot。

概觀

自動化 Bot 會以垃圾郵件填滿 Weblog 和其他網站,提交批註表單而不需任何使用者互動。 ASP.NET AJAX Control Toolkit 中的 NoBot 控制項可協助對抗這些 Bot。

步驟

失敗 Bot 的其中一個常見方法是使用 CAPTCHAs 完全自動化的公用圖靈測試,告訴電腦和人類分開。 Turing 測試原本是一項測試,其中有人需要決定通訊夥伴是人類還是電腦。 在 Web 中,CAPTCHA 通常包含一些扭曲字母的影像。 概念是只有人類可以在影像上讀取字母,而 OCR 演算法將會失敗。

這種方法有數個優點和缺點,但本教學課程的討論超出此教學課程的範圍。 不過,ASP.NET AJAX Control Toolkit 中有一個控制項,可提供類似的方法: NoBot 。 比 CAPTCHA 更容易克服,但在部落格上非常容易使用,而且在部落格上非常容易使用,如果大部分垃圾郵件嘗試都遭破壞,則其會被視為成功。 NoBot

NoBot 如果至少符合下列其中一個條件,則會攔截目前 ASP.NET Web 表單的回傳:

  • 瀏覽器無法在停用 JavaScript 時解決 JavaScript 問題 ()
  • 使用者已將表單提交至快速
  • 用戶端 IP 位址在一段時間內送出表單太常。

若要檢查這些條件, NoBot 控制項需要這些屬性, (所有屬性皆為選擇性) :

  • ResponseMinimumDelaySeconds 回傳之間的最小秒數
  • CutoffWindowSeconds 從一個 IP 回傳的時間間隔長度為量值
  • CutoffMaximumInstances 每個時間間隔的最大秒數

下列標記要求在回傳之間至少經過兩秒,且在 30 秒間隔內只有五個回傳或更少:

<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() 方法來完成。 它有一個引數 (做為 out 參數/ ByRef 參數,) 類型 NoBotState 為 。 其字串表示包含檢查失敗的原因, 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,或在前兩秒內提交表單,或在 30 秒內提交表單七次時,您會收到錯誤訊息。 不過,正確使用此控制項,因為只有大約 90-95% 的使用者已啟用 JavaScript,因此 5-10% 的使用者將會失敗 NoBot 的測試。

這個錯誤訊息可能是 Bot 所造成

這個錯誤訊息可能是 Bot 造成, (按一下即可檢視大小完整的映射)