본문으로 건너뛰기

เนื้อหาภาษาไทย / 태국어 콘텐츠

시스템 가이드 검수 완료된 콘텐츠

การสร้าง Form พร้อม CSRF Token

บทความนี้อธิบายวิธีการสร้างฟอร์มที่ป้องกันการโจมตี CSRF โดยการสร้างและแทรก CSRF token ที่ไม่ซ้ำกันลงในฟอร์มในรูปแบบ hidden field และเก็บ token นี้ไว้ใน session...

การสร้าง Form พร้อม CSRF Token

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

หลักการทำงาน

หลักการคือ เราจะสร้าง token ที่ไม่ซ้ำกันสำหรับแต่ละ session และเก็บ token นี้ไว้ใน session จากนั้นเราจะแทรก token นี้ลงในฟอร์มที่ผู้ใช้เห็น เมื่อผู้ใช้ส่งฟอร์ม เราจะตรวจสอบว่า token ที่ส่งมาตรงกับ token ที่เก็บไว้ใน session หรือไม่ ถ้าไม่ตรง แสดงว่าอาจมีการโจมตี CSRF

ขั้นตอนการสร้าง Form พร้อม CSRF Token

  1. สร้าง Hidden Field: สร้าง input field ที่มี type เป็น "hidden" เพื่อเก็บ CSRF token
  2. เก็บ Token ใน Session: สร้างและเก็บ CSRF token ไว้ใน $_SESSION
  3. ส่ง Token ไปพร้อมกับ Form: แทรก CSRF token ลงใน hidden field ของฟอร์ม

ตัวอย่างโค้ด

1. สร้างฟังก์ชันสำหรับสร้าง CSRF Token:

<?php
session_start(); // เริ่มต้น session (ถ้ายังไม่ได้เริ่ม)

function generateCSRFToken() {
  // สร้าง token ที่คาดเดาได้ยาก
  $token = bin2hex(random_bytes(32));
  $_SESSION['csrf_token'] = $token;
  return $token;
}

// สร้าง token หากยังไม่มีใน session
if (!isset($_SESSION['csrf_token'])) {
  generateCSRFToken();
}

$csrf_token = $_SESSION['csrf_token'];

?>

คำอธิบาย:

  • session_start(): เริ่มต้น session เพื่อให้เราสามารถใช้ $_SESSION ได้ หากคุณเริ่มต้น session ไว้แล้วในไฟล์อื่น ไม่จำเป็นต้องเรียกใช้อีกครั้ง
  • generateCSRFToken(): ฟังก์ชันนี้สร้าง token โดยใช้ random_bytes(32) ซึ่งสร้าง string สุ่ม 32 ไบต์ จากนั้นเราแปลงเป็น hexadecimal string ด้วย bin2hex() ทำให้ token มีความยาว 64 ตัวอักษร
  • $_SESSION['csrf_token'] = $token;: เก็บ token ที่สร้างขึ้นไว้ใน session เพื่อใช้ตรวจสอบในภายหลัง
  • if (!isset($_SESSION['csrf_token'])): ตรวจสอบว่ามี token ใน session อยู่แล้วหรือไม่ ถ้ายังไม่มี ก็จะสร้าง token ใหม่
  • $csrf_token = $_SESSION['csrf_token'];: ดึงค่า token จาก session มาเก็บไว้ในตัวแปร $csrf_token เพื่อนำไปใช้ในฟอร์ม

2. สร้าง Form พร้อม Hidden Field ที่มี CSRF Token:

<form action="process_form.php" method="POST">
  <label for="username">Username:</label><br>
  <input type="text" id="username" name="username"><br><br>

  <label for="password">Password:</label><br>
  <input type="password" id="password" name="password"><br><br>

  <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">

  <input type="submit" value="Submit">
</form>

คำอธิบาย:

  • <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">: นี่คือ hidden field ที่เราใส่ CSRF token ลงไป
  • name="csrf_token": กำหนดชื่อของ field เป็น csrf_token เพื่อให้เราสามารถเข้าถึงค่านี้ได้ในไฟล์ process_form.php
  • value="<?php echo htmlspecialchars($csrf_token); ?>": กำหนดค่าของ field เป็น CSRF token ที่เราสร้างไว้ก่อนหน้านี้ htmlspecialchars() ใช้เพื่อป้องกัน XSS โดยการแปลงอักขระพิเศษให้เป็น HTML entities

ข้อควรระวัง

  • การใช้ htmlspecialchars(): สำคัญมากที่จะต้องใช้ htmlspecialchars() เมื่อแสดงค่า $csrf_token ใน HTML เพื่อป้องกัน XSS
  • การ regenerate token: บางครั้งคุณอาจต้องการ regenerate token หลังจากที่ผู้ใช้ส่งฟอร์มสำเร็จแล้ว เพื่อป้องกันการ reuse token
  • Session Timeout: ตรวจสอบให้แน่ใจว่า session timeout เหมาะสม หาก session หมดอายุ CSRF token ก็จะหายไปด้วย

สรุป

ในบทนี้ เราได้เรียนรู้วิธีการสร้างฟอร์มที่มี CSRF token ซึ่งเป็นขั้นตอนสำคัญในการป้องกันการโจมตี CSRF ในบทต่อไป เราจะมาดูวิธีการตรวจสอบ CSRF token เมื่อผู้ใช้ส่งฟอร์ม

Office.in.th Custom Service

이 구조를 바탕으로 시스템을 개발하거나 맞춤 변경하고 싶으신가요?

Office.in.th는 엔터프라이즈 웹 애플리케이션, API 연동, 공공/민간 업무 관리 시스템을 설계·개발하며 장기 지원을 제공합니다.

소프트웨어 개발 서비스 보기