天天看點

php 防灌水機制,我設計的防灌水和封IP程式原理

我設計的防灌水程式和封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回複,通知網友在論壇繼續讨論。