filter.txt 讀取敏感詞列表(每行一個)。$_POST['mess']。preg_match 不區分大小寫匹配。<?php
if ($_POST) {
// 讀取敏感詞文件,自動去除換行符
$filter_words = file("./filter.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// 也可用 explode("\n", file_get_contents(...)) 但 file() 更簡潔
$str = $_POST['mess'] ?? '';
foreach ($filter_words as $word) {
$word = trim($word);
if ($word === '') continue;
// /i 不區分大小寫,邊界可按需加 \b
if (preg_match("/" . preg_quote($word, '/') . "/i", $str)) {
echo "<script>alert('您輸入的內容含非法內容,請重輸!');</script>";
echo "<a href='index.php'>返回</a>";
exit;
}
}
echo "您輸入的內容是: " . htmlspecialchars($str);
}
?>
<h2>測試過濾是否生效:</h2>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<p><textarea name="mess" cols="40" rows="4"></textarea></p>
<p><input type="submit" name="sub" value="send"></p>
</form>
賭博
色情
暴力
廣告
敏感詞4
| 問題 | 解決方案 |
|---|---|
| 正則特殊字符導致錯誤/誤匹配 | 使用 preg_quote($word, '/') 轉義元字符 |
| 大量敏感詞遍歷效率低 | 構建 Trie 樹 / AC 自動機 / DFA 算法,單次掃描 O(n) 完成匹配 |
| 繞過手段(同音字、拆字、插入零寬字符) | 引入文本規範化:全半角統一、去除零寬字符、拼音/聲母比對、同義詞擴展 |
| 誤傷正常內容(如「幹」字) | 引入白名單、上下文語義分析、機器學習分類器 |
| 前端繞過提交 | 後端必須二次驗證,前端僅作體驗優化 |
| XSS 風險 | 輸出時 htmlspecialchars(),內容存庫前不轉義,輸出時轉義 |
簡單項目可用 file() + preg_match 快速實現;中大型項目務必引入專業過濾庫或雲服務,並建立「規則庫+模型+人工複審」三層防線。