WordPress Plugin With LINE Notification

เพราะนายแฮกเกอร์ตัวร้าย เลยต้องเรียกไลน์มาจัดการแล้วล่ะ!!!

ช่วงเดือนสองเดือนที่ผ่านมา เกิดเหตุการณ์เว็บไซต์ที่สร้างด้วย WordPress โดนแฮกเข้ามาฝั่งมัลแวร์ต่าง ๆ เช่นเขียนประกาศตัวว่าฉันแฮกได้แล้วน้า เว็บเธอมันช่างไร้ความซีเคียวริตี้เหลือเกิน (วิ่งไปร้องไห้) หรือไม่ก็มาฝัง script redirect ไปเว็บขายของมั้งแหละ แต่เราจะไม่ได้มาพูดเรื่องวิธีแก้ แต่จะมาพูดถึงเรื่อง 1 ในวิธีติดตามเว็บไซต์ของเรา เพื่อป้องกันเหตุการณ์ที่อาจจะเกิดการซ้ำรอยได้ในอนาคต


เริ่มตั้งจากโจทย์ที่ว่า เราไม่ได้เข้ามา Maintenance บ่อย ๆ หลังจากที่จบ Development Phase ไปแล้ว และอยากหาเครื่องมือที่จะมาช่วยแจ้งความเคลื่อนไหวที่ผิดปกติแทน ซึ่งก็มี Plugin ที่น่าสนใจหลายตัวที่จะคอยตรวจสอบและส่งอีเมลแจ้ง มีทั้งที่เสียเงินและฟรี แต่มันยังไม่พอหน่ะสิ อยากได้ที่แจ้งเข้ามาที่ Platform ที่เราใช้บ่อย ๆ ก็คือ ไลน์ (LINE) มันมีไหมนะ

มีจ้า แต่จะแจ้งเตือน Order สินค้านะ เอ้าาา ตอบโจทย์แบบคนละครึ่งซะงั้นไป มีแจ้งไลน์นะ แต่เป็นการแจ้งที่ผูกกับระบบแบบ Form เป็นหลัก เช่น สั่งสินค้า ยืนยันสินค้า หรือพวกข้อสอบถามต่าง ๆ และเท่าที่เช็คคือประยุกต์ใช้กับระบบที่ต้องการไม่ได้ (หรืออาจจะดูไม่รอบคอบเองก็เป็นได้) เลยตัดปัญหาว่า มะ ทำเองเลยก็ได้!!


เริ่มวางแนวคิดและวิธีการทำงาน

จะมี Plugin WordPress ตัวนึงที่โดยส่วนตัวมักจะใช้บ่อย ๆ ก็คือ WP Activity Log ส่วนใหญ่เอาไว้เช็คว่าใครทำอะไรบ้างกับระบบ โดยจะมีรายละเอียดบอกที่ส่วนของหลังบ้านอยู่แล้ว และตัว plugin เองก็เปิดให้สามารถเรียกใช้งาน Hook ได้ด้วย เลยออกมาเป็นแนวทางแบบนี้

LINE Notification

ในรายงานที่ระบบหลังบ้านของตัว plugin จะมีบอก Severity Code ของแต่ละ activity อยู่ ซึ่งสามารถศึกษาได้จากที่ WordPress activity log severity levels และถ้าชุด Severity Code ที่เราเฝ้าระวังอยู่เกิดขึ้นมา ให้แจ้งเตือนไปที่ไลน์ทันที เป็นไงล่ะ Easy~


สิ่งที่ต้องเตรียม

มีไม่เยอะแค่ 2 อย่าง

  1. LINE Account : ก็บัญชีไลน์ที่ใช้กันปกตินี่แหละ หรือใครอยากจะสมัครใช้ใหม่ก็ได้เลยนะ
  2. Knowledge of Creating Plugin WordPress : มีความรู้ความเข้าใจเบื้องต้นเกี่ยวกับการสร้าง plugin ที่ลองศึกษาง่าย ๆ จากบทความทั่วไป แล้วก็คลิปมีที่สอนไว้พอสมควรเลย

วิธีการทำงานของ LINE Notify API (แบบเข้าใจง่าย)

  1. ส่งข้อความด้วย API Service ผ่าน param ที่กำหนดให้ชื่อว่า “message”
  2. เรียกใช้งาน API พร้อมกับส่งข้อความและ Token ที่สร้างไว้
  3. รับข้อความที่ส่งในห้องแชทที่กำหนดไว้

LINE Notification

ในบทความนี้เราจะพูดถึง API เส้นพระเอกของเราคือ

POST https://notify-api.line.me/api/notify

ซึ่งก่อนที่จะเริ่มใช้เราจะต้องสร้าง Access Token ของแชทหรือห้องแชทที่เราต้องการส่งข้อความไปหา เตรียมเอาไว้ก่อน

วิธีการสร้าง Access Token Login เข้าระบบที่ LINE Notify จากนั้นคลิกที่ชื่อ account บนขวามือและเลือก “My page”

LINE Notification

คลิกที่ปุ่ม “Generate token” ที่อยู่ด้านล่างของหน้า page

LINE Notification

เลือกห้องแชทหรือกรุ๊ปแชทที่เราต้องการส่งข้อความ

LINE Notification

จากนั้นจะเห็น Popup ที่แสดง Access Token มาให้ และจะเห็นแค่ครั้งเดียวเท่านั้นเพราะงั้นต้อง copy เก็บไว้ด้วยนะ (ไม่ได้แคปภาพเก็บไว้ให้ดูจ้า)


มาเริ่มสร้าง Plugin กัน!

เริ่มจากสร้างโครงสร้าง Structure อย่างง่ายกันก่อนเลย ตามด้านล่าง

line-notification
|---index.php
|---line-notification.php

หลังจากสร้างโฟลเดอร์และไฟล์แล้ว ให้กำหนดข้อมูลของ plugin ลงในไฟล์ line-notification.php ตามแบบนี้ อันที่จริงสามารถกำหนดได้มากกว่านี้นะ แต่อันนี้ไม่ได้ทำซับซ้อนมากเลยกำหนดข้อมูลไว้เท่าที่ใช้งานก็พอ

<?php
/**
 * Plugin Name: Line Notification
 * Description: Line Notification for alert dangerous activity.
 * Version: 1.0
 * Author: Phusit
 */

Step 1 : สร้างฟังก์ชันเพื่อ Hook เอาข้อมูลมาใช้

เริ่ม step แรกกันที่สร้าง function ขึ้นมาในไฟล์ line-notification.php ที่เราจะ filter เอาข้อมูลที่ได้มาจาก plugin WP Activity Log ดักเอาข้อมูลก่อนจะบันทึกลง database มาใช้

/**
 * Note: function filter ที่จะดักเอาข้อมูลมาก่อนที่จะบันทึกลง database
 *
 * @param array   $event_data - Event data.
 * @param integer $event_id   - Event id.
 * @return integer
 */
function sample_event_data_before_log( $event_data, $event_id ) {
    line_noti_send_message($event_data); // ฟังก์ชันที่เราจะรับข้อมูล และส่ง line noti
    return $event_data;
}
add_filter( 'wsal_event_data_before_log', 'sample_event_data_before_log', 10, 2 );

จากนั้นสร้างฟังก์ชัน line_noti_send_message($event_data) เตรียมเอาไว้ก่อน (ก็คือตั้งชื่อไว้ก่อนแหละ) แล้วส่ง param ที่ชื่อ $event_data ผ่านเข้าไป

ซึ่งข้อมูลก็จะแตกต่างกันตามแต่ละ Event ID ด้วย (เท่าที่ลองเช็คข้อมูลดูนะ) เพราะงั้นถ้าต้องการใช้งานที่ค่อนข้างละเอียดมากขึ้นอาจจะต้องทดสอบหลาย ๆ แบบด้วยว่าจะได้ข้อมูลออกมาเป็นแบบไหน


Step 2 : เตรียมฟังก์ชันสำหรับส่ง notification

มาต่อกันที่ด้านในฟังก์ชัน line_noti_send_message($event_data) ที่เรากำหนดชื่อไว้แล้วนั้น จะต้องมีอะไรบ้างตามนี้เลย

  1. เช็ค key ที่ชื่อ ‘Severity’ จาก $event_data ที่ส่งเข้ามา : ในที่นี่เราเช็คจากระดับของ ‘Severity’ แทนเพราะน่าจะครอบคลุม ส่วนที่เราเฝ้าระวังกันอยู่ ดูเรื่อง Log Level ได้ที่นี่ เลยเขียนแบบง่าย ๆ ตามด้านล่าง
// ใช้ if เพราะเน้นสะดวก levl ที่ระวังในตอนเริ่มต้นยังไม่มาก
if ($event_data['Severity'] == 400 || $event_data['Severity'] == 500 || $event_data['Severity'] == 550 || $event_data['Severity'] == 600) {
	// เขียนอะไรตรงนี้ดีล่ะ?
}

  1. ภายใน if ก็เริ่มส่งข้อความ (แบบกำหนดคำไว้) ไปหาไลน์ : ภายใน if จากข้อที่ 1. เราจะเริ่มกำหนดข้อความ และใช้ HTTP request ของ WordPress คือ wp_remote_post( $url, $args ) ในการส่ง
// กำหนดข้อความและกำหนด access token ที่ headers
$message = '?message=<ข้อความที่กำหนด>';
$args = array(
    'headers' => array(
        'Authorization' => 'Bearer ' . <ACCESS_TOKEN ที่ได้จากการสร้างไว้>
    )
);

// ส่งข้อมูลโดยใช้ function wp_remote_post()
$response = wp_remote_post($url.$message, $args);

// ตรวจสอบผลของการส่งข้อมูลว่าสำเร็จหรือไม่
if (!is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200) {
    // API ส่งสำเร็จ
    $response_body = wp_remote_retrieve_body($response);
} else {
    // API ส่งไม่สำเร็จ
    $error_message = is_wp_error($response) ? $response->get_error_message() : 'Error occurred.';
}

Step 3 : เสร็จแล้วก็ไปกด Activate Plugin

หลังจากจัดการกับ code เรียบร้อยแล้ว ที่เมนู Plugins จะเห็น plugin ที่เราสร้าง แสดงอยู่ในรายการด้วย (เย้~) ให้เราทำการกด activate เพื่อใช้งานได้เลย

LINE Notification


เอาล่ะ! มาลองทดสอบหน่อยสิ๊~

หลังจากที่ activate ไปแล้ว วิธีทดสอบอย่างง่ายที่สุดคือการลอง install หรือ uninstall plugin สักตัวนึงจะเห็นผลชัดเจนที่สุด จากนั้นให้ไปเช็คผลใน LINE ของเรา และนี้คือผลที่ได้

LINE Notification

เย้~ ข้อความมาแล้วววว สังเกตว่ามีตกแต่งข้อความเพิ่มเติมนิดหน่อย และบรรทัดที่แจ้ง Object กับ Event Type นั้น ข้อมูลก็ได้มาจาก $event_data นั้นแหละ ลองประยุกต์เล่นเพิ่มเติมได้


มาสรุปกันหน่อย

หลังจากที่เอา plugin ตัวนี้ไปใช้งานจริงก็ช่วย manage website ได้เยอะขึ้น เวลาที่เว็บไซต์นั้นมี admin หลายคนก็จะเห็นแจ้งเตือนการเคลื่อนไหวที่สุ่มเสี่ยงล่ะ (แต่ส่วนใหญ่หลังบ้านก็จะมีคุยกันแหละ ว่ากำลังจะทำอะไร) ซึ่งต่อไปก็มีแพลนที่จะขยายและพัฒนาตัว plugin ตัวนี้ให้คลอบคลุมกับที่ต้องใช้งานมากขึ้น

ในบทความนี้ก็มาแชร์ประสบการณ์และความรู้ที่คาดว่าน่าจะมีประโยชน์แก่คนที่หลงเข้ามา หวังว่าจะช่วยได้ไม่มากก็น้อย แล้วเจอกันใหม่จ้า ~~


อ้างอิง

  • LINE Notify : https://notify-bot.line.me/en/
  • WP Activity Log : https://wordpress.org/plugins/wp-security-audit-log/
  • WP Activity Log - severity levels : https://wpactivitylog.com/support/kb/severity-levels-wordpress-activity-log/
  • Log Levels : https://github.com/Seldaek/monolog/blob/main/doc/01-usage.md#log-levels
  • Icons : https://www.flaticon.com/

Tags:

LINE NotificationWordPressLINE