2006/10/05

Anti-SPAM 擋廣告機器人

這裡指的廣告是那種留言版、討論區常出現留言為一大堆連結的文章,
而不是像免費空間的Banner、Popup廣告視窗 (甚至還有我敢發誓、我是紹偉的某玩意XD)
---

看上廣告機器人是自動化的,自然跟實際操作電腦的人有些許不同,而擋廣告就是要強制分別出這兩種。
如果你是人類,則繼續處理要求;如果你是機器人,就仆街去吧。

目前常見的擋廣告方法:
  1. 採會員認證方式
    不是每個地方都適用,試想一個訪客留言版還要註冊你還想留下足跡嗎?
  2. CAPTCHA 認證碼方式 (語音或圖像)
    看上人腦能夠處理看或聽的訊息而機器人不會(事實上程式寫的好也有可能會, ex: PWNtcha),
    不過這樣對於視障或聽障人士似乎是有點不公平啦。
  3. 詢問簡單題目
    記得某些留言版或是Wiki有這樣的設計,問你11-3是多少一類的。
  4. 利用geek JavaScript
    用一些難以讓機器人判讀,但瀏覽器顯示卻正常的東西來擋,基本上是取巧型。
  5. DNSBL即時黑名單功能
    先查詢發文IP,如果曾經發過Spam就擋下來。此招沒啥用,像全鎖廣告IP一樣沒啥用。
    專門發Spam的機器很聰明的,IP雖然不是偽造但也沒參考價值,因為常常變換。
  6. 樣本分析過濾法
    說起來這招算是頗有成效的其中一招,大家一眼就看出是Spam的文章必定有其特徵,
    將大量樣本利用數學方式計算後得出資料庫。缺點是要經過訓練。
  7. Field Trap 欄位陷阱
    設計幾個讓機器人去填,但一般人不可能填的到的欄位,如果有值表示是機器人。

網路上有很多高手致力於防治Spam的工作,方法也很多樣 (上面就列了七個,應該有更多)
其中最普遍的應該是CAPTCHA了吧,但嚴格說起來它有其缺陷 (剝奪某些人的人權XD)
如果能找到幾個對人類使用者影響不大、又能有效對付Spam機器人的方法那該有多好。
所謂的有效不一定要100%,但也要有90%的能力才好。

其中我自己有個Spam試驗漁場,本來是舊網站留言版實驗區,
後來廢了之後沒去動它,幾年之後才發現已經變成漁場了(驚)
聽說Spam會針對常見的留言版程式 (像這個實驗區的YYBBS) 搜尋並轟炸。
而我就改造留言版程式來收集一些資料,分析習性。

結論:

  • 鎖IP的方法是治標不治本。收集到的樣本IP幾乎都不同,但有些是同Class。
  • CAPTCHA很有用。不過這樣人類使用者也會懶的發文。
  • Field Trap 欄位陷阱也很有用。
    根據我的觀察,Spam Bot會對CGI程式傳送常見的幾個欄位值,
    例如name, url, sub, comment, home, email等等。你看看大多數的表單是不是這樣?
    所以我們將這些欄位全部作成陷阱,利用CSS使其隱藏,如此沒有JavaScript的問題。
    然後另外造出正常的欄位,注意到的是這些欄位的名稱也算geek,例如SnYhkiuYV。
    絕一點可以利用動態生成,檢查(阻擋)完成後,後端再對應到正確的變數值。
以上所言都是全自動化Spam。如果是人工的想必怎樣擋都擋不了。
也許這時候CAPTCHA或是簡單題目正發揮了阻擋的功效吧XD
由於樣本數不夠的關係,我也不能說哪個方法是最有用的,不過一般而言CAPTCHA是比較有用的。
當然,一些比較取巧的方法也可以用看看。如果可以,我覺得欄位陷阱還不錯?
當然交互搭配是更棒的了。

6 則留言:

  1. >利用geek JavaScript
    把form tag用Javascript印出來這招就能擋掉不少不是用瀏覽器「犯案」的bot了 XD

    回覆刪除
  2. 這樣吧,不如來多層陷阱?
    就像公司一樣,除了有保全人員,還有監視器、刷卡辨識等重重措施防護。

    我預定在PMC加入Field Trap,內建的。
    雖然我沒有一個PMC的Spam Lab,不過看Maid版被轟炸的程度我就知道這不能等閒視之。
    以YYBBS來說,目前的5.8版已內建CAPTCHA,起碼有基本防護。
    對一般沒有修改應對能力的使用者也可以安心使用。

    雖然一個貼圖版加這些東西似乎多此一舉 (回到從前H神對我說的)
    不過顧慮到基本層面防護,不得不加。
    ---

    至於Spam類型有很多。撇去人工不談,機器的應該也有利用瀏覽器和不用兩種吧?
    後者對Cookie、Session或是JavaScript應該都很弱。
    前者還是有弱點,Field Trap就是針對他們的弱點的設計。

    回覆刪除
  3. 我換網址了= = 只是你當初的拍手有問題 害得我一直沒辦法跟你講

    我也是採用Javascript印出form tag的方式
    另外預計加入認證碼加入欄位陷阱的方法
    http://sdcgf.org/css.htm
    這邊的是試作型 想到再加入

    回覆刪除
  4. >>浅羽 季紅
    我以為老兄當兵去了就沒回應了咧XD
    記得什麼itaiwan的後來就進不去了。

    拍手有問題的時期應該是暑假轉移主機的時候吧,CGI權限一直搞不定乾脆就拆了XD

    看到淺羽兄的做法又讓我想到更多可能性,感謝啟發啊。
    不過我覺得NoScript的盛行,其實用JavaScript來阻擋不是非常好的做法。
    假如網站使用AJAX而不得不使用,那就放心用吧。
    如果不是,網站管理者應當沒理由要求使用者開啟Script支援。
    不過CSS倒是一個好辦法,我所說的欄位陷阱就使用了CSS隱藏陷阱欄位。
    另外看到background-image的做法,真是拍案叫絕。

    基本上欄位陷阱 + CAPTCHA驗證碼 + 樣本分析大概可以除去99% Spam吧。
    最後一項太難做了,只能用黑名單字串來頂替一下。

    回覆刪除
  5. 就如你所說 現在已經是AJAX年代了
    會不開啟JavaScript支援的 我分為兩種人
    1. 排除一些JavaScript花招的人
    2. 跳過JavaScript檢驗的人

    所以當初是因為想過濾掉2類型的人
    才改用用JavaScript列印出form tag
    而且現在的表單 大多融合了JavaScript驗證的功能
    (如PHPBB的表單)
    如果沒開啟JavaScript 表單反倒是變的很奇怪

    而使用background-image的做法 純粹是為了排版方便(爆)
    兩大瀏覽器都喜歡讓圖片排版會比文字排版往上一點點
    所以我想這個方法應該是最簡便的寫法= =

    不過我覺得最好的方法可能是 自己寫一個留言版= =
    如你所說
    機器人大多是攻擊一些知名的留言版
    那麼 自己寫一個不常見的留言版的話 被攻擊的機率應該會下降很多

    朋友的留言版
    http://kais0089.netfirms.com/cgi-bin/mkakikomitai.cgi

    我的留言版
    http://sdcgf.org/9/

    幸運的是 開版超過半年有餘 沒被攻擊過= =

    回覆刪除
  6. 選擇關閉Script的人可能擔心安全性的疑慮,例如XSS或是惡意程式碼。
    大部分的人我想應不會隨意關閉 (IE要關還要調安全性設定)
    不過不贊成強迫使用,除非是非用不可。

    >>不過我覺得最好的方法可能是 自己寫一個留言版
    留言版運作原理都一個樣,
    不如把欄位名稱改一改,CGI檔名改一改就好?

    mkakikomitai.cgi 常常被攻擊啊,
    常見的留言版通常沒什麼防護而且架設者也沒能力應對修改,
    因此得靠設計者自行加入(如YY-BOARD)或者其他非官方修改版。

    回覆刪除