Thủ thuật chống spam comment từ “vòng gửi xe” cho WordPress



Xin chào các bạn,

Không cần phải nói nhiều về spam đối với cộng đồng Internet nói chung và cộng đồng blogger nói riêng. Spam ngày nay rất hiện đại nhưng chính vì vậy mà nó cực kỳ “hại điện”. Nếu bạn nghĩ spammer lọ mọ vào blog của bạn, lọc cọc gõ từng chữ (hay copy/paste) thì bạn nhầm rồi đấy. Với một chút kiến thức về lập trình, cộng với chút hiểu biết về giao thức POST, GET trên WordPress, spammer dễ dàng viết được hàng tá những chương trình để comment trên các blog một cách tự động chỉ bằng một cú click chuột.

1. Cách những plugin chống spam hoạt động từ trước đến nay

WordPress có rất nhiều plugin để giúp chúng ta ngăn chặn spam comment, đại đa số chúng đều hoạt động tương đối hiệu quả. Tuy nhiên phương thức hoạt động của chúng chưa thực sự triệt để. Điều này nghĩa là gì ? Khi một comment được gửi lên, nếu comment đó bị đánh dấu là spam thì nó bị đưa vào tình trạng chờ phê duyệt. Dù sau này người quản trị (admin) có duyệt hay không thì comment đó vẫn đã được ghi vào cơ sở dữ liệu của WordPress và dù ít hay nhiều cũng khiến CSDL của bạn phình lên một “tẹo”. Hãy nghĩ xem, blog của bạn đếm có tất cả là 10.000 comments liệu bao nhiêu phần trăm trong số đó là comment thật ? Chắc chỉ 1/3 ! Vậy 2/3 kia là comment rác, tuy rằng nó đã bị xoá bởi admin nhưng nó cũng đã chiếm mất 6.666 vị trí trong cơ sở dữ liệu đáng lẽ dành cho những comment thực sự có giá trị.

Tận dụng sức mạnh của Comment Blacklist

Tận dụng sức mạnh của Comment Blacklist

Trong Admin Dashboard \ Settings \ Discussion của WordPress có phần Comment Blacklist – nơi bạn có thể liệt một số địa chỉ web, email, IP, từ khoá … vào BlackList. Danh sách này được các plugin sử dụng với mục đích tham khảo. Khi gặp các comment có thông tin lưu trong Blacklist, nó sẽ đánh dấu comment đó là spam và chờ bạn xử lý. Đó chính là điểm chưa triệt để mà Việt Coding có nói ở trên. Nếu đã biết comment đó là spam thì sao còn cho nó ghi vào CSDL ? Lãng phí tài nguyên vô ích !

2. Cách mới: Chặn spam từ … vòng gửi xe

Nhận ra khuyết điểm đó của WordPress – xin nhấn mạnh đó là khuyết điểm của WordPress, chứ không phải của plugin – Việt Coding đã nghĩ ra cách chặn các comment spam dựa vào Blacklist ngay trước khi nó được ghi vào CSDL. Với cách làm này, CSDL của bạn sẽ không phải chứa comment spam và chúng ta cũng không phải mất thời gian dọn dẹp rác mỗi khi vào blog.

Điểm hạn chế của cách làm này là bạn phải thay đổi một chút lõi của WordPress vì hiện tại – trước tình hình spammer lộng hành dữ dội như vậy – WordPress chưa hỗ trợ hook can thiệp vào giữa quá trình này. Do đó sự thay đổi này sẽ mất khi bạn nâng cấp phiên bản WordPress.

Bù lại, hiệu quả của nó rất đáng quan tâm. Khi comment form được submit, dữ liệu trên form sẽ được kiểm tra bao gồm: Địa chỉ email, địa chỉ web và nội dung comment. Chỉ cần một trong ba mục nêu trên có chứa từ khoá đã bị liệt vào blacklist, comment đó ngay lập tức sẽ bị từ chối trước khi nó được WordPress ghi vào CSDL. Điều này giúp giảm thiểu rác trong CSDL WordPress của bạn.

Cách thức thực hiện:

Mở tập tin wp-comments-post.php trong thư mục gốc bạn cài WordPress. Tìm đến đoạn sau:

[php]
$comment_author = ( isset($_POST[‘author’]) ) ? trim(strip_tags($_POST[‘author’])) : null;
$comment_author_email = ( isset($_POST[’email’]) ) ? trim($_POST[’email’]) : null;
$comment_author_url = ( isset($_POST[‘url’]) ) ? trim($_POST[‘url’]) : null;
$comment_content = ( isset($_POST[‘comment’]) ) ? trim($_POST[‘comment’]) : null;
[/php]

Chèn vào ngay bên dưới đoạn mã sau:

[php]
/* BEGIN This teak help us check if a commentor is spammer */
$bl = get_option(‘blacklist_keys’);
$arr_bl = explode("\\r\\n", $bl);

for ( $i=0; $i < count($arr_bl) ; $i++)
{
if(strstr($comment_author_url, $arr_bl[$i]) != false)
die(‘Sorry ! You can not comment here !’);

if(strstr($comment_author_email, $arr_bl[$i]) != false)
die(‘Sorry ! You can not comment here !’);

if(strstr($comment_content, $arr_bl[$i]) != false)
die(‘Sorry ! You can not comment here !’);
}

/* END This teak help us check if a commentor is spammer */
[/php]

Lưu lại và upload lên hosting. (Đừng quên sau mỗi lần nâng cấp WordPress phiên bản mới bạn phải thực hiện lại sự thay đổi này nhé !)

Truy cập vào Admin Dashboard \ Settings \ Discussion -> Comment Blacklist, để thêm vào một từ khoá thử nghiệm hoặc nếu đã có thì bạn ghi nhớ nó. Ví dụ tôi sẽ thử nghiệm với từ khoá test.com. Truy cập vào một bài viết và tiến hành gửi thử một comment có chứa từ khoá test.com. Khi nhấn gửi comment nếu bạn nhận được thông báo “Sorry ! You can not comment here !” nghĩa là bạn đã thành công rồi đó.

Công việc của bạn từ nay sẽ khoẻ hơn, chỉ cần chăm chỉ cập nhật thêm dữ liệu cho phần Comment Blacklist nữa thôi. Bạn có thể làm giàu thêm “bộ sưu tập spammers” bằng cách tra cứu trên Google tìm các dữ liệu về spammers đã được các blogger ghi nhận lại. Và chúng ta sẽ nói gì ? “Goodbye Spammers !

Chúc các bạn thành công và thử tính toán xem mức độ spam trên blog của bạn có giảm hẳn không nhé !

About Author

Tuấn Anh

Là một người đam mê lập trình, hiện tập trung mảng phát triển ứng dụng web dựa trên nền tảng của WordPress. Đồng thời, nhằm đạt sự trọn vẹn trong công việc freelance, tôi đang học đồ hoạ, để có thể tự mình thiết kế layout, logo và những thứ khác liên quan đến đồ họa. Mục tiêu vài năm tới: Tôi sẽ là Full Web Developer = Graphics Design + Coding. Vietcoding Blog viết về WordPress, chia sẻ kinh nghiệm, mẹo vặt, viết plugin, làm theme và ôm ấp ý tưởng viết một Web Application Framework dựa trên WordPress. Đồ hoạ là chuyên mục đang được chuẩn bị trong tương lai.



40 thoughts on “Thủ thuật chống spam comment từ “vòng gửi xe” cho WordPress

  1. CAA says:

    Hay quá, em cũng đang đau đầu vì spam đây.
    Cái plugin Akismet của em không hiểu sao tự nhiên không hoạt động nữa. Nó báo không kết nối được với máy chủ, trước nay vẫn hoạt động bình thường, không hiểu sao thời gian gần đây không hoạt động.
    Bác giúp em với.

    1. Vì Việt Coding chưa bị lỗi như bác nên không rõ hướng xử lý cụ thể thế nào. Bác thử cài lại plugin hoặc copy thông báo lỗi rồi tìm trên Google thử xem sao 🙂

  2. Đúng là nếu không để ý, blog lớn nhiều comment sẽ có comment spam và mặc dù đã xóa nó vẫn lưu thông tin gì đó như Vietcoding đề cập thì dữ liệu sẽ nhiều mất

    1. Mấy blog lớn như eBlogViet, MinhMeo,… có mấy chục ngàn comments nhưng con số đó ảo, chắc chỉ cỡ 1/3 là thật sự còn lại 2/3 số đếm của ~ comment đã bị xoá. Đúng như bác nói là lãng phí 1 con số quá lớn trong CSDL 🙂

  3. Clays Nguyen says:

    Hic….Blog của em cũng đang bị nạn spam hoàng hoành…thử dùng thủ thuật này xem sao 🙂

    1. Bác thử đi ! Dùng cách này mỗi thằng spammer chỉ có duy nhất 1 cơ hội trong đời để spam website của nó trên blog của bác thôi 🙂

  4. Hẹn Hò Cùng Võ Sĩ says:

    Cao thủ, em ấn tượng với cái tít của bác, tò mò vào đọc ngay 🙂

    1. Chúc bác thành công nhé !

  5. Blog Tips says:

    Em sài thằng Akismet thấy cũng ổn, 1 tháng nó chặn được tầm 20k spam 🙁 ác quá.

    1. Akismet là một plugin nổi tiếng quá rồi. Tính năng của nó rất tốt duy chỉ có điều mặc dù đã nhận ra một commentor / comment là spam rồi mà nó vẫn “cẩn thận” ghi nhận lại chờ admin giải quyết. Cách này khiến tài nguyên hosting bị lãng phí không ít. Trong khi cách ở bài viết là nếu nhận ra là spammer thì ngăn chặn ngay tức thì 🙂

      1. Blog Tips says:

        Tài nguyên ko sợ tốn mà ngại nhất khoản mỗi lần upgrade lại phải edit source 🙁 hơi mệt. Bệnh lười mà. 😀

        1. Hiện tại do WordPress chưa cung cấp phương thức để can thiệp vào giữa quá trình này nên dù muốn Việt Coding cũng chưa thể viết thành một plugin được 🙁

          1. Blog Tips says:

            Như thế này là may mắn lằm rồi, có cái dùng là tốt rồi. rồi sau này sẽ có cách viết ra plugins thôi 😀

      2. Blog Cơ Khí says:

        Đúng là Akismet có cái hạn chế này, mà tính mình nhìn thấy có báo spam là không đợi đc, lại phải vào xóa, nhiều lúc bực mình :(. Đôi khi akismet cũng báo nhầm comments của bạn là spam nữa, phải kiểm tra lại cũng mệt. Cách này rất hay :X

  6. thái vũ says:

    hehe, em cũng làm như phần 1 thôi, phần 2 nhac làm lắm 🙂

  7. duyhen says:

    cách này hay thật, bác cũng từng có plugin cho wp hay bác ý kiến với họ hỗ trợ phần đó cho bác làm 1 plugin. cảm ơn bác về bài viết.

  8. duyhen says:

    em làm như vậy nhưng nó không báo như bác nói mà chỉ đưa comment thẳng vào spam, không vào chờ xét duyệt nữa??????

    1. Nếu không có báo lỗi thì chắc bác làm thiếu chỗ nào rồi ?

      1. duyhen says:

        chỉ có vậy em làm đủ mà bác. có bác nào bị vậy k nhỉ?

  9. Jen says:

    Mình ko biết được hay không. Nhưng thực sự mình ko thích cách làm này. Ko thích phải tác động đến các file thư mục root wordpess.

    1. “Ngộ biến tùng quyền” thôi bác 🙂

  10. Blog Nha Dat says:

    Bài viết rất hay! Em có sài cái ask nhưng không ăn thua nhưng cái này có vẻ hay ở chỗ chặn name vs domain 😀 Học được rất nhiều thủ thuật cho blog hay từ vietcoding 🙂

    1. Việt Coding có cập nhật lại đoạn code một chút. Các bác xem lại nhé !

  11. EM thấy sử dụng pulgin SI Captcha cũng khá hiệu quả 😀

  12. Dich thuat says:

    Thế bên Drupal có cách nào chống được spam không vẫy?

    1. Rất tiếc Việt Coding chưa từng sử dụng Drupal nên không thể trả lời chính xác câu hỏi của bạn ! Bạn thử vào các trang web chia sẻ kinh nghiệm sử dụng Drupal hỏi thử xem. 🙂

  13. vuikhoe says:

    Em làm giống vậy, nhưng khi comment thông thường cũng báo lỗi warning hàng loạt là sao ạ :((

    1. Bạn post chi tiết thông báo lỗi lên Việt Coding xem cho nhé 🙂

      1. vuikhoe says:

        Không hiều sao em xoá đi làm lại thì được rồi, cám ơn anh. Bài viết thật tuyệt 🙂

  14. Shan says:

    Hix, cái này chắc chỉ áp dụng cho các spamer dùng 1 địa chỉ e-mail hoặc Ip thôi. Đăng này blog của em đang bị spam bằng soft thì phải. Các comments khác nhau về tên, e-mail nên ko dùng cách này được.

    1. Bạn đừng chặn theo tên mà hãy chặn domain name và một số từ khóa. Vì spammers khi spam blog của mình thì mục đích chính là chèn được cái domain của họ vào đó. Khi mình chặn rồi, ví dụ abc.com thì spammers chẳng còn thiết tha gì spam blog của mình nữa. Tên, email và IP thì như bạn nói không có tác dụng gì mấy 🙂

  15. Tuyệt vời, em đã chèn code anh vào blog, nó làm việc rất hiệu quả. Thanks anh 🙂

    1. Chúc mừng bạn nhé ! Giờ spammers phải chạy xa khỏi blog của bạn rồi đó !

  16. Chào bác, có cách nào chống spam bằng phép toán mà không cần dùng plugin được ko bác

    1. Em chưa hiểu nghĩa từ “phép toán ” của bác ? Ý bác là “giải thuật” ?

  17. Mr.Chu says:

    Phần trên Việt Coding phải can thiệp vào lõi của wordpress, mỗi lần nâng cấp ta lại phải kiểm tra sửa lại file wp-comments-post.php.

    Mr.CHU xin chia sẻ function sử dụng hook của wordpress, các bạn chỉ việc chép vô file function.php trong theme của bạn là ok.

    [php]
    function sosanh_noidung($string, $array) {
    foreach($array as $ref) { if(strstr($string, $ref)) { return true; } }
    return false;
    }
    function drop_bad_comments() {
    if (!empty($_POST[‘comment’])) {
    $comment_author = ( isset($_POST[‘author’]) ) ? trim(strip_tags($_POST[‘author’])) : null;
    $comment_author_email = ( isset($_POST[’email’]) ) ? trim($_POST[’email’]) : null;
    $comment_author_url = ( isset($_POST[‘url’]) ) ? trim($_POST[‘url’]) : null;
    $comment_content = ( isset($_POST[‘comment’]) ) ? trim($_POST[‘comment’]) : null;

    $blacklist = get_option(‘blacklist_keys’);
    $blacklists = explode("\r\n", $blacklist);

    if (sosanh_noidung($comment_author, $blacklists)
    || sosanh_noidung($comment_author_email, $blacklists)
    || sosanh_noidung($comment_author_url, $blacklists)
    || sosanh_noidung($comment_content, $blacklists))
    {
    wp_die( __(‘ERROR! Your comment contains banned words.’) );
    }
    }
    }
    add_action(‘init’, ‘drop_bad_comments’);
    [/php]

  18. Kien Nguyen says:

    Có vẻ như dùng cả cách 2 của vietcoding và thêm vào function.php của Mr.Chu vẫn không giải quyết được triệt để. Vì không chặn được hoàn toàn comment nên để trong backlist là tất cả các chữ cái riêng lẻ và các chữ số, các ký tự đặc biệt. Nhưng vẫn nhận được comment spam, đặc biệt là của tàu khựa. điên quá B|

  19. cung thich says:

    Thấy cái tít của bạn hay vào coi thử. Mình chưa hiểu liệu với code này của bạn Tuấn Anh có ảnh hưởng tới Akismet không? Mình thích cái code của bạn Tuấn Anh hơn, chứ cho váo hàm Funktion mình thấy hiểm quá. Việc update WordPress và thay cái code vào thì chỉ chưa đầy 1p, nhưng sợ liệu nó có bị tranh chấp với plugin Akismet không ấy. Cám ơn bạn Tuấn Anh, mình rất thích ý tưởng này của bạn.


Got Something To Say:

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax

GENESIS FRAMEWORK