我設計的防灌水程式和封IP程式,已經在ufoaq實施了一個多月,效果很好,既簡單又高效,比我在2006年設計的封IP程式又簡單了一些。防灌水程式主要是通過寫入Cookies,封IP程式是通過寫入Cookies兼直接從資料庫讀封IP的清單,本文以PHP為例。因為本程式需要寫入Cookies,請在最外層的程式如post.php、reply.php、submit.php等等的最開頭寫入<?ob_start ();?>這句,否則會報錯。
防灌水程式的原理如下,本程式寫在一個留言判别的公用元件如judge.php,此檔案被其它檔案使用include()函數包含引用:
$te=30; //可在每個需要引用此公用元件的程式如post.php中聲明30秒内隻能發一次帖,如果省略$te=30;,那麼在如下的一行會将其預設為60。
if (!$te) $te=60;
$t9=time();
if ($t9-$_COOKIE[te]if ($kx) {……} //給網友端(使用者端)提示錯誤,并且程式不運作
?>
然後在post.php中寫入Cookies,如下:
封IP程式的原理如下:
$ip=$_SERVER["REMOTE_ADDR"];
$i=…… //$i是從資料庫中提取的封IP清單,例如$i的值為"125.33.125.255,133.134.99.1",多個IP用逗号隔開,此值可以在網站背景修改。因為網站背景的結構不同,本文中沒有說明修改此值的程式,請程式員自行編寫程式。因為下面的程式使用strpos()函數,而不是用循環程式來判斷使用者的IP是否存在于此$i的值當中,是以可以設定很多個需要封閉的IP,幾百個也不會很影響程式的效率。當使用者端寫入Cookies後,使用者已經被完全封閉IP,$i的值也可以全部删除。
$j=$_COOKIE[pe];
$h="您的IP位址已經被鎖定。";
if ($j) $kx.=$h;
elseif (strpos($i,$ip)!==false){$kx.=$h;
if (!$j) setcookie("pe","50",time()+86400*9,"/");}
if ($kx) {……} //給網友端(使用者端)提示錯誤,并且程式不運作
?>
倒數第2行是封閉IP 9天,如果需要讓封閉IP為其它的天數,可以修改86400*9為其它值,例如86400*30是封閉IP 30天。本程式的思路是由if ($j) $kx.=$h;這一行判斷,如果$_COOKIE[pe]的值不為空,則直接提示IP已被封閉;如果$_COOKIE[pe]為空,則用if (strpos($i,$ip)!==false)判斷使用者的IP是否在清單當中,如果在清單當中,則提示IP已被封閉,并且寫入Cookies。使用Cookies和IP清單雙重判斷,增加了判斷的條件和準确性。
4條評論:
3 自由勇 2009-09-24 12:28
Trackback來自 《防止批量spam的方法》
防灌水程式,可自由設定N秒内不能再發帖,線上及時封閉IP。
4 自由勇 2009-09-28 16:07
Trackback來自 《部落格+論壇的方式》
我覺得比較好的模式是用部落格+論壇的方式,當超過500回複,通知網友在論壇繼續讨論。