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

Published by Việt Coding on

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é !

Quảng cáo tài trợ


Việt Coding

Là một người đam mê lập trình, tôi vọc vạch đủ thứ liên quan đến lập trình cho thoả chí tò mò. Hiện làm chủ yếu ở mảng phát triển ứng dụng di động cho iOS và Android với React Native. Thỉnh thoảng vọc vạch mấy thứ liên quan đến Internet of Things như Smart Home. Đang nghịch mấy con Raspberry Pi và thấy nó cũng thú vị :)

40 Comments

CAA · 28/03/2011 at 22:40

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.

    Việt Coding · 29/03/2011 at 07:22

    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 🙂

Hùng Hồng · 30/03/2011 at 12:44

Đú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

    Việt Coding · 31/03/2011 at 08:34

    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 🙂

Clays Nguyen · 30/03/2011 at 13:24

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 🙂

    Việt Coding · 30/03/2011 at 18:08

    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 🙂

Hẹn Hò Cùng Võ Sĩ · 30/03/2011 at 15:49

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

Blog Tips · 30/03/2011 at 20:38

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

    Việt Coding · 31/03/2011 at 07:41

    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ì 🙂

      Blog Tips · 31/03/2011 at 08:51

      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à. 😀

        Việt Coding · 31/03/2011 at 09:00

        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 🙁

          Blog Tips · 31/03/2011 at 12:37

          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 😀

      Blog Cơ Khí · 03/04/2011 at 22:14

      Đú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

thái vũ · 01/04/2011 at 14:14

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

duyhen · 02/04/2011 at 21:20

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.

duyhen · 02/04/2011 at 22:01

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??????

    Việt Coding · 03/04/2011 at 03:52

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

      duyhen · 03/04/2011 at 07:21

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

Jen · 08/04/2011 at 07:49

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.

Blog Nha Dat · 12/04/2011 at 14:11

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 🙂

    Việt Coding · 13/04/2011 at 07:29

    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é !

Scam PTC Update · 16/04/2011 at 15:18

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

Dich thuat · 09/05/2011 at 01:30

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

    Việt Coding · 09/05/2011 at 08:25

    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. 🙂

vuikhoe · 13/06/2011 at 00:40

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 ạ :((

    Việt Coding · 13/06/2011 at 09:41

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

      vuikhoe · 14/06/2011 at 06:29

      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 🙂

Shan · 23/06/2011 at 20:44

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.

    Việt Coding · 24/06/2011 at 09:05

    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 🙂

Tấn Việt · 22/08/2011 at 11:26

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

    Việt Coding · 22/08/2011 at 11:57

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

thumua24h.com · 01/09/2011 at 16:27

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

    Việt Coding · 06/09/2011 at 16:35

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

Mr.Chu · 15/10/2011 at 19:15

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]

Kien Nguyen · 12/11/2014 at 12:54

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|

cung thich · 27/06/2015 at 20:13

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.

Thủ thuật chống spam comment từ “vòng gửi xe” cho wordpress | HariCHU [dot] NET · 27/04/2011 at 13:44

[…] nhận lại. Và chúng ta sẽ nói gì ? “Goodbye Spammers !” Chúc thành công! Nguồn {VietCoding} Chống spam, comment, wordpress tips Bài viết cùng chuyên mục Loại bỏ /category/ […]

Mẹo kết hợp chặn spam giữa plugin và code · 10/09/2013 at 10:00

[…] không hiển thị cho các bạn đi tìm đâu. Tôi xin mạn phép chia sẻ lại mẹo của VietCoding  đó để các bạn biết mà […]

Leave a Reply to Blog Tips Cancel reply

Avatar placeholder

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