本系列第三篇將介紹如何在 PHP 聊天室中實作使用者封鎖功能,並針對動態 IP 位址設計防護機制,最後補充記錄使用者 IP 的方法,以利管理員監控與識別冒名頂替者。
利用 $REMOTE_ADDR 變數取得使用者 IP,透過陣列 $banned_array 儲存被封鎖的 IP 位址。在處理使用者發言前,先檢查該 IP 是否在封鎖清單中:
<?php
for ($counter = 0; $counter < sizeof($banned_array); $counter++) {
if ($banned_array[$counter] == $REMOTE_ADDR) {
print("You have been banned from this chat");
exit;
}
}
?>
exit 會立即終止腳本執行,確保被封鎖使用者無法使用聊天室。
許多使用者使用動態 IP,單一 IP 封鎖效果有限。解決方案是比對 IP 區塊(前三段),例如 192.168.1.xxx 整個 C 類網段。提供一個簡單函數產生 IP 遮罩:
<?php
function makeMask($ip) {
$ip_array = explode(".", $ip);
return "$ip_array[0].$ip_array[1].$ip_array[2]";
}
?>
修改檢查邏輯,改用遮罩比對:
<?php
for ($counter = 0; $counter < sizeof($banned_array); $counter++) {
if (makeMask($REMOTE_ADDR) == makeMask($banned_array[$counter])) {
print("You have been banned from this chat");
exit;
}
}
?>
如此即可封鎖整個 IP 區塊,大幅提升防護效果。
為了讓管理員能監控線上使用者,將使用者暱稱 $name 與 $REMOTE_ADDR 寫入 iplist.html。原理與訊息記錄類似:讀取現有檔案,捨棄舊標頭與舊記錄,重新寫入新標頭、新記錄與新標尾,並使用表格排版以利閱讀。
<?php
$header = "<table>";
$footer = "</table>";
$new_ip = "<tr><td>$name</td><td>$REMOTE_ADDR</td></tr>";
$ip_array = file("iplist.html");
for ($counter = 1; $counter < 20; $counter++)
$old_ips .= $ip_array[$counter];
?>
將整理後的內容寫回檔案,管理員即可透過隱藏網址查看 IP 列表,發現冒名頂替者。
嘗試實作、享受樂趣、累積經驗——這就是我開始 PHP 開發的方式,如今已以此為職業。祝大家聊天愉快!