延續前兩部分,本文實作三大管理功能:基於 IP 的用戶封鎖、動態 IP 區段封鎖策略、IP 與暱稱對應記錄追蹤,完善聊天室的基本治理能力。
<?php
// 讀取封鎖清單 (每行一個 IP)
$banned = file("banned.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$client_ip = $_SERVER['REMOTE_ADDR'];
foreach ($banned as $ban_ip) {
if (trim($ban_ip) === $client_ip) {
header("Content-Type: text/html; charset=utf-8");
die('<font color="red" face="arial" align="center">您已被禁止使用本聊天室</font>');
}
}
// 通過檢查,繼續處理發言邏輯...
?>
針對撥接/ADSL 動態 IP,封鎖前三段 (C 類網段) 而非單一 IP:
<?php
function getIPMask($ip) {
$parts = explode('.', $ip);
// 取前三段組成網段遮罩,如 192.168.1.xxx
return implode('.', array_slice($parts, 0, 3));
}
$client_mask = getIPMask($_SERVER['REMOTE_ADDR']);
foreach ($banned as $ban_ip) {
if (getIPMask(trim($ban_ip)) === $client_mask) {
die('您所在的網段已被封鎖,無法使用聊天室');
}
}
?>
策略權衡**:
| 策略 | 精準度 | 誤傷風險 | 適用場景 |
|---|---|---|---|
| 單一 IP 封鎖 | 高 | 低 | 固定 IP 惡意用戶、伺服器攻擊源 |
| /24 網段封鎖 (前三段) | 中 | 中 (可能波及同網段無辜用戶) | 動態 IP 重撥規避、特定 ISP 惡意群體 |
| /16 網段封鎖 (前兩段) | 低 | 高 (大範圍誤傷) | 極端情況:國家級封鎖、大型機房攻擊 |
<?php
// 讀取現有記錄
$ip_records = file("iplist.html");
$old_ips = '';
for ($i = 1; $i < 20; $i++) { // 保留最新 19 筆
if (isset($ip_records[$i])) $old_ips .= $ip_records[$i];
}
// 新記錄:使用表格結構方便管理員查看
$name = htmlspecialchars($_POST['name'] ?? '匿名');
$ip = $_SERVER['REMOTE_ADDR'];
$new_ip = "<tr><td>$name</td><td>$ip</td></tr>\n";
// 組裝完整 HTML (含表格標頭)
$header = '<html><body bgcolor="#000000" text="#ffffff">' .
'<table border="1"><tr><th>暱稱</th><th>IP 位址</th></tr>';
$footer = '</table></body></html>';
// 寫入檔案
$fp = fopen("iplist.html", "w");
fwrite($fp, $header . "\n");
fwrite($fp, $old_ips);
fwrite($fp, $new_ip);
fwrite($fp, $footer);
fclose($fp);
?>
建立獨立隱藏 URL (如 admin_iplist.php3) 僅管理員知曉,直接 include iplist.html 即可即時監控發言者身分,發現冒名頂替 (同一 IP 使用多個暱稱) 等違規行為。
- 程式碼模組化:將重複的檔案讀寫、HTML 組裝封裝為函數/類別
- 自動封鎖腳本:管理員一鍵將指定 IP/暱稱加入 banned.txt
- URL/Email 自動連結化:使用
preg_replace正則掃描訊息內容,轉換為可點擊連結- 敏感詞過濾:載入關鍵字庫,發言前替換/攔截
- 資料庫遷移:檔案改為 MySQL 表,支援高併發、索引查詢、備份
- WebSocket 即時推送:替代 Meta Refresh,毫秒級延遲、雙向通訊
多用戶同時發言時,fopen(..., "w") 會導致資料遺失。生產環境必須使用檔案鎖 flock() 或遷移至資料庫。