對 Spam 用欄位陷阱

概述

有鑒於 Pixmicat! 的散播率越來越廣,開始有 Spammer 會針對其表單欄位格式進行 Spam 攻擊。經過研究發現大多數 Spammer 針對攻擊的表單欄位都是常見名稱如 name, email, url, com, homepage, mail 等等 (有興趣可以整理一下看看是不是這樣 :-))。利用這點,將常見名稱的表單欄位做成陷阱,並以 CSS 樣式隱藏起來以防一般正規使用者誤填。而另作名稱很怪異的表單欄位當成正常的欄位。 (名稱可更改,建議定期更換以免被 Spammer學習識破)

而 Spammer 大多數會將前述常見名稱的表單欄位填上廣告訊息,送出時由於偵測到陷阱欄位已遭修改,不接受發文並且警告。

此一技術被稱為 欄位陷阱 (Field Trap)。

原理

將名稱為 name 的表單欄位作成陷阱,並設上預設值且使用 CSS 隱藏,另以新的怪異名稱欄位做為接收資料的欄位。

<style type="text/css">
.h { display: none; } /* 隱藏表單欄位 */
</style>
<input type="text" name="name" value="DO NOT EDIT" class="h"><input type="text" name="hBv8YU6IrI" value="">

而 PHP 端接受姓名資料時,並不使用 name 欄位資料,而是這個名稱怪異的欄位資料。

<?php
define('NAME', 'hBv8YU6IrI'); // 定義真正的名稱欄位
 
$name = isset($_POST[NAME]) ? $_POST[NAME] : ''; // 真
$trap_name = isset($_POST['name']) ? $_POST['name'] : ''; // 假 (陷阱)
 
if($trap_name!='DO NOT EDIT'){ exit('Spammers go die!'); } // 修改到陷阱欄位,阻擋
...
?>

這樣就做到防止 Spammer 發文了。

Simple Field Trap (SFT)

顧名思義,是欄位陷阱機制的簡化版本,為祭典版所用。
利用SpamBot會填入<input name="url">的特性來設置欄位陷阱。

問題

注意到的是雖然怪異名稱可以自訂,但請遵守 PHP 變數的命名原則 (首字元只能是英文和一部分的特殊符號),不然欄位陷阱將會因為 PHP 解析變數失敗造成問題發生。

如果使用者端的表單不是最新版本而是快取版本 (可能是透明代理、代理伺服器或是瀏覽器快取),也會因為欄位名稱對應問題而誤踩陷阱。請清空瀏覽器快取並按下鍵盤 Ctrl+ F5 強制要求最新頁面以解決此問題。

另外如果曾經使用過瀏覽器提供的密碼管理員功能儲存密碼的話,也有可能造成瀏覽器代填至陷阱欄位而造成誤踩陷阱問題。請嘗試清除儲存的密碼資料。

除非特別註明,本頁內容採用以下授權方式: Creative Commons Attribution-Noncommercial-Share Alike 2.5 License.