Spam thường có những đặc điểm gì
Dù tool có đổi kiểu thế nào, spam phổ thông vẫn có vài dấu hiệu rất quen:
- Nhiều link trong một nội dung ngắn
- Từ khoá lặp lại bất thường
- Ký tự lạ, trộn chữ và số vô nghĩa
- Nội dung quá ngắn hoặc quá dài
Nguyên tắc phát hiện spam thực dụng
- Không cố bắt 100% spam
- Ưu tiên chặn spam rõ ràng
- Chấp nhận false positive ở mức thấp
- Code phải đọc được và chỉnh được
Chiến lược chấm điểm nội dung
Thay vì quyết định đúng/sai ngay lập tức, ta chấm điểm spam:
- Mỗi dấu hiệu cộng một số điểm
- Vượt ngưỡng thì coi là spam
Cách này linh hoạt và dễ mở rộng hơn nhiều.
Hàm phát hiện nội dung spam đơn giản
<?php
function is_spam_content(string $content, int $threshold = 5): bool {
$score = 0;
$text = mb_strtolower(trim($content));
// 1. nội dung quá ngắn
if (mb_strlen($text) < 10) { $score += 2; } // 2. quá nhiều link preg_match_all('/https?:\/\//i', $text, $matches); if (count($matches[0]) >= 2) {
$score += 3;
}
// 3. lặp từ khoá bất thường
$words = preg_split('/\s+/u', $text);
$wordCounts = array_count_values($words);
foreach ($wordCounts as $count) {
if ($count >= 5) {
$score += 2;
break;
}
}
// 4. ký tự lạ (trộn chữ số, ký hiệu)
if (preg_match('/[a-z]{3,}\d{3,}|[^\p{L}\p{N}\s]{4,}/u', $text)) {
$score += 2;
}
// 5. in hoa quá nhiều
preg_match_all('/[A-Z]/', $content, $caps);
if (count($caps[0]) > 20) {
$score += 1;
}
return $score >= $threshold;
}
Vì sao không dùng blacklist từ khoá cứng
Blacklist kiểu:
viagra, casino, crypto
Rất dễ bị né bằng cách chèn ký tự, viết sai chính tả hoặc thay thế chữ cái. Chấm điểm theo hành vi spam bền hơn nhiều.
Ví dụ sử dụng thực tế
<?php
$content = $_POST['message'] ?? '';
if (is_spam_content($content)) {
die('Nội dung bị đánh dấu là spam');
}
// tiếp tục lưu hoặc xử lý
Nên xử lý spam như thế nào
- Không nên xoá ngay
- Đánh dấu pending hoặc spam
- Cho admin kiểm tra nếu cần
Khi nào nên nâng cấp giải pháp
Nếu website của bạn:
- Bị spam có tổ chức
- Có hàng nghìn request mỗi ngày
- Cần độ chính xác cao
Lúc đó hãy nghĩ tới CAPTCHA, rate limit, hoặc dịch vụ chống spam chuyên dụng.
Kết luận
Không phải bài toán nào cũng cần giải pháp phức tạp. Một hàm phát hiện spam đơn giản, chấm điểm hợp lý và đặt đúng ngưỡng có thể giúp bạn giữ hệ thống sạch sẽ mà không biến codebase thành bãi chiến trường.
Spam thì ngày càng khôn, nhưng backend mà tỉnh là vẫn chặn được!
Bình luận