Hàm phát hiện nội dung spam đơn giản trong PHP

Comment, form liên hệ, đăng ký tài khoản… chỗ nào có input là chỗ đó có spam. Không phải hệ thống nào cũng cần AI hay dịch vụ bên thứ ba. Nhiều trường hợp chỉ cần một hàm phát hiện spam đơn giản nhưng đúng chỗ là đã chặn được 70–80% rác vặt ngoài kia. Bài này tập trung vào cách làm gọn, dễ hiểu, và đủ dùng cho đa số website PHP.

Hàm phát hiện nội dung spam đơn giản trong PHP

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


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...