PlusMagi's Blog By Pitt Phunsanit Backend,Cybersecurity PHP: การสร้างและตรวจสอบ CSRF Token ในฟอร์ม

PHP: การสร้างและตรวจสอบ CSRF Token ในฟอร์ม

ในโลกของการพัฒนาเว็บแอปพลิเคชันที่ต้องมีการทำธุรกรรมสำคัญ ไม่ว่าจะเป็นการเปลี่ยนรหัสผ่าน การอัปเดตข้อมูลส่วนตัว หรือการโอนเงิน การปกป้องระบบจากภัยคุกคามทางไซเบอร์จึงเป็นหัวใจสำคัญอย่างยิ่ง หนึ่งในช่องโหว่ที่นักพัฒนาต้องระวังคือ CSRF (Cross-Site Request Forgery)

ในฐานะ Senior Architect เราทราบดีว่าการป้องกันช่องโหว่นี้ไม่สามารถละเลยได้ บทความนี้จะเจาะลึกหลักการของ CSRF และแสดงวิธีการสร้างและตรวจสอบ CSRF Token อย่างถูกต้องและปลอดภัยด้วย PHP โดยผสานการทำงานกับฐานข้อมูล PostgreSQL เพื่อให้ระบบของคุณมีความแข็งแกร่งระดับองค์กรอย่างแท้จริง

🛡️ CSRF คืออะไร และทำไมต้องป้องกัน?

CSRF คือการโจมตีที่ผู้ไม่หวังดี (Attacker) หลอกให้ผู้ใช้ที่กำลังเข้าสู่ระบบอยู่ (Authenticated User) ทำการส่งคำร้องขอ (Request) ไปยังเว็บแอปพลิเคชันของเราจากเว็บไซต์อื่นโดยที่ผู้ใช้ไม่รู้ตัว ตัวอย่างที่พบบ่อยคือการที่แฮกเกอร์ทำให้ผู้ใช้กดปุ่มที่ส่งคำสั่งเปลี่ยนอีเมลหรือเปลี่ยนรหัสผ่านโดยที่ผู้ใช้ไม่ได้ตั้งใจ

หลักการป้องกันที่ได้มาตรฐานที่สุดคือการใช้ CSRF Token ซึ่งเป็นรหัสสุ่ม (Cryptographically Secure Random String) ที่เซิร์ฟเวอร์สร้างขึ้นและแนบไปกับฟอร์ม เมื่อผู้ใช้ส่งฟอร์มกลับมา เซิร์ฟเวอร์จะต้องตรวจสอบว่า Token ที่ส่งมานั้นตรงกับ Token ที่เคยสร้างและจัดเก็บไว้ในเซสชันหรือไม่ หากไม่ตรงกัน แสดงว่าคำร้องขอนั้นอาจมาจากแหล่งภายนอก จึงต้องปฏิเสธคำขอทันที

⚙️ ขั้นตอนการสร้างและตรวจสอบ CSRF Token ด้วย PHP และ PostgreSQL

การป้องกัน CSRF Token จะทำงานเป็นวงจร 3 ขั้นตอน คือ 1) สร้าง Token 2) จัดเก็บ Token 3) ตรวจสอบ Token เมื่อมีการส่งฟอร์ม

1. การสร้างและจัดเก็บ Token (PHP Session)

เราใช้ PHP Session ในการสร้าง Token ที่เป็นค่าสุ่มสูง และต้องแนบ Token นี้ไปในฟอร์ม HTML

PHP

// 1. สร้าง Token ใหม่และเก็บใน Session
if (!isset($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// 2. แสดง Token ในฟอร์ม
$token = $_SESSION['csrf_token'];
?>
<form method="POST" action="process.php">
    <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($token); ?>">
    <!-- ฟิลด์อื่น ๆ -->
    <button type="submit">บันทึกข้อมูล</button>
</form>

2. การตรวจสอบ Token (PHP Logic)

ในไฟล์ process.php เมื่อมีการส่งฟอร์มเข้ามา เราต้องตรวจสอบความถูกต้องของ Token ก่อนดำเนินการใด ๆ

PHP

// ตรวจสอบว่ามีการส่ง Token มาหรือไม่
if (!isset($_POST['csrf_token'])) {
    die("Error: Missing CSRF Token.");
}

// ตรวจสอบ Token ที่ส่งมากับ Token ที่เก็บใน Session
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    // หากไม่ตรงกัน ให้ยกเลิกการทำงานและแจ้งเตือน
    session_destroy();
    die("Error: Invalid CSRF Token. Request blocked.");
}

// ถ้าผ่านการตรวจสอบ Token แล้ว จึงดำเนินการต่อ
// ... โค้ดสำหรับประมวลผลข้อมูล ...

3. การเชื่อมโยงกับ PostgreSQL (Data Integrity)

แม้ว่า Token จะถูกจัดการใน Session แต่การดำเนินการกับฐานข้อมูล (PostgreSQL) จะต้องมั่นใจว่าการเปลี่ยนแปลงข้อมูลนั้นมาจากแหล่งที่เชื่อถือได้เสมอ ตัวอย่างเช่น การอัปเดตข้อมูลผู้ใช้ต้องผ่านการตรวจสอบ Token ก่อนเสมอ

SQL

-- ตัวอย่างการยืนยันความสมบูรณ์ของข้อมูลก่อนการอัปเดต
-- (สมมติว่ามีการตรวจสอบ Token แล้วใน PHP)
UPDATE users
SET email = '[email protected]', last_updated = NOW()
WHERE user_id = 123;

✅ บทสรุป: ความแข็งแกร่งของระบบ

การใช้ CSRF Token เป็นมาตรการป้องกันเชิงลึกที่จำเป็นสำหรับทุกเว็บแอปพลิเคชันที่จัดการข้อมูลสำคัญ การผสาน PHP Session สำหรับการสร้าง Token และใช้ PostgreSQL สำหรับการจัดเก็บและจัดการข้อมูลที่ได้รับการป้องกัน จะช่วยยกระดับความปลอดภัยของระบบคุณได้อย่างมาก การทำตามขั้นตอนเหล่านี้อย่างเคร่งครัดจะช่วยให้คุณมั่นใจได้ว่าคำร้องขอที่เข้ามายังระบบของคุณนั้นมาจากผู้ใช้ที่แท้จริงเท่านั้น