เขียนเรื่องเกี่ยวกับ spam มาหลายรอบ และก็พยายามค้นหาวิธีใหม่ใหม่อยู่เรื่อย แม้ว่า akismet จะดัก spam ได้ถึง 99.98% แต่ปัญหาก็ยังอยู่ที่มันเกิดการ query ทุกครั้งที่ spam comment อันใหม่เข้ามา

พวก plug-in ป้องกัน spam ทั้งหลายที่มีออกมาให้ใช้กัน ส่วนใหญ่จะเป็นการแก้ปัญหากันที่ comment form โดยการเพิ่มให้ใส่ค่าต่างต่าง อาทิ รูปภาพตัวอักษร หรือตัวเลข ประมาณว่า พวกที่ไม่ใช่คนจะต้องตอบไม่ได้

แต่ปัจจุบัน spam มันก้าวล้ำไปแล้ว โดยเฉพาะ wordpress ที่มีคนใช้มากมาย ไม่นานนักก็มีคนเขียน script ขึ้นมาให้ส่งค่า ไปที่ตัวรับค่าให้เขียนข้อมูล ลงเดต้าเบสตรงตรง โดยไม่ต้องผ่านหน้าฟอร์ม ทีนี้พวกตัวกัน ที่ให้กรอกโน่นนี่ ก็แทบจะไร้ประโยชน์ไปทันที …ยังดีที่ akismet ดักพวกนี้ได้เกือบทั้งหมด แต่วันนึงก็มาเป้นร้อย นั่นก็หมายความว่า ต้อง query ข้อมูลขยะลงเดต้าเบส วันหนึ่งเป็นร้อยครั้ง

วิํธีการอันหนึ่ง ที่เคยมีหลายคนแนะนำ คือการเปลี่ยนชื่อไฟล์ที่ โดนเล็งซะ ซึ่งในกรณีนี้คือ wp-comments-post.php ไปเป็นชื่ออื่นซะ และไปแก้ค่า form action ใน comments.php หรือ comments-popup.php แ่ต่วิธีนี้กันได้แค่ spam bot โง่โง่เท่านั้น เพราะรุ่นพัฒนามันจะส่ง crawler อัตโนมัติ เข้ามาอ่านค่าใน comment form ของเราก่อน ว่าส่งค่าไปที่ไฟล์ไหน จากนั้นมันก็ส่งค่าเป็นที่ไฟล์นั้นโดยตรง ไม่ต้องผ่านฟอร์มอีกต่อไป

ตอนนี้กำลังลองวิธีใหม่ของคุณ bruno rodrigues ที่เขียนเรื่อง wordpress anti-spam
เท่าที่ลองหลังจากผ่านมา 20 ชั่วโมง มี spam หลุดเข้ามาได้สามตัว คาดว่ามาจากการเข้ามากรอก ที่ฟอร์มโดยตรง อันนี้สังเกตได้จากข้อมูลที่โดนจับไว้ใน akismet ตัวฟอร์มคอมเมนต์ที่ผมใช้ จะไม่มีช่องให้กรอกอีเมล์ แต่ spam comment ส่วนใหญ่ที่เข้ามาก่อนหน้านี้ จะมีค่าอีเมล์มาด้วยเสมอ ทำให้รู้ได้ว่ามันส่งมา โดยไม่ได้ผ่านฟอร์ม

วิธีการของคุณ rodrigues ก็คือสร้างไฟล์ตรวจขึ้นมาอีกอัน ใช้ชื่อว่า wp-spam.php ซึ่งมีโค้ดดังนี้

<?
  function spam( $spam = "" ) {
    if( $_SERVER['REQUEST_URI'] == "/xmlrpc.php" ||
      $_SERVER['REQUEST_URI'] == "/wp-admin/post.php" ||
      $_SERVER['REQUEST_URI'] == "/wp-admin/page.php") return;

    if( $spam == "" ) {
      if( !isset( $_SERVER['HTTP_RAW_POST_DATA'] ) )
        $_SERVER['HTTP_RAW_POST_DATA'] = file_get_contents( 'php://input' );
      $spam = join( "\n", $_GET ). "\n".
          join( "\n", $_POST ). "\n".
          $_SERVER['HTTP_RAW_POST_DATA'];
    }
    if( preg_match( "#(s"."pammer99".

      "|x"."anax|v".""."icondin|v"."icodin|f"."ioricet|e"."jacula|d"."iazepam".
      "|b"."utrin|p"."rodol|h"."ydroco|r"."efinanc|i"."ncest"."|c"."asino".
      "|u"."ltram|p"."orn|c"."ialis|z"."ithromax|v"."iagra|t"."ramadol".
      "|P"."hentermine|a"."ciphex|c"."asino|P"."rotonix|T"."ramadol|C"."ialis".
      "|Z"."oloft|c"."hlymidia|g"."ambling|p"."oker|A"."dipex|A"."lprazolam".
      "|V"."alium|X"."enical|L"."evitra|d"."ildo|\ss"."loans?\s|m"."ortgage".
      "|d"."eep\s*throat|b"."low\s*jobs?|e"."nlargment|K"."ournikova".
      "|b"."igtits|c"."arpal\s*tun+el|c"."um\s*shot|c"."armen\s*elec?tra".
      "|f"."uck|a"."dult\s*date|a"."dult\s*dating|p"."harmacy\s*online".
      "|s"."he\s*male|m"."ednewus|b"."abes|p"."enis\s*enlargement|g"."ay\s*sex".
      "|\ss"."sex\s|p"."rescription|b"."ea?stiality|M"."eridia".
      "|d"."iamond.?pendant|a"."sian\s*beauties|a"."mateur\s*sex|i"."knowall".
      "|m"."ortgage|r"."efinance|s"."pyware|g"."uestbook|t"."ylenol|m"."otrin".
      "|b"."oomp|a"."dderall|\[U"."RL=".
      ")#i", $spam, $m ) ) {
      error_log("Ignoring spam [".$m[1]. "] [$spam]");
      header("Status: 410", true, 410);
      print "go away spammer [".$m[1]."]."; exit;
    }
    if( preg_match_all("#(?:<|&(amp;)*lt;)a [^>]*href#is", $spam, $m) &&
      sizeof($m[0]) > 4) {
      error_log("Ignoring multiple link spam [$spam]");
      header("Status: 410", true, 410);
      print "go away spammer [too many links]."; exit;
    }
  }
?>

แก้ไฟล์ wp-config.php โดยเพิ่มโค้ดนี้เข้าไปอีกหนึ่งบรรทัด

require("wp-spam.php"); spam();

จากนั้นก็อัพโหลดทั้ง wp-config.php และ wp-spam.php ไปไว้ใน root ของ wordpress

เจ้าตัว wp-spam จะช่วยดัก spam word ที่ระบุไว้ก่อน ไม่ให้ผ่านไป จนถึงขึ้นเขียนข้อมูลลงเดต้าเบส หรือแม้ว่าไม่มี spam word ที่ตรงกันเลย ก็ยังมีอีกชั้น คอยตรวจหาลิงก์ที่ส่งมา ถ้ามีเกินสี่อัน มันก็จะไม่ให้ผ่านไป ซึ่งโดยปกติพวกสแปมบ็อต มันชอบส่งลิงก์มาครั้งละเป็นสิบอยู่แล้ว และเท่าที่ลองทดสอบดู ก็กันได้เป็นอย่างดี นอกจากจะกันพวกสแปมปิศาจ ที่ส่งค่ามาอย่างเดียว ยังกันพวกที่เข้ามากรอกที่ฟอร์มโดยตรง

นับเป็นวิธีที่น่าสนใจและใช้ได้ผล… จนกว่าสแปมบ็อตจะพัฒนาไปอีกขั้น
ป.ล. รูปด้านบนจับภาพไว้เมื่อวันศุกร์ ผ่านมาสองวันกลายเป็น 23,621 spam ละ

2007.09.23