ข้ามไปยังเนื้อหาหลัก
คู่มือระบบ เนื้อหาผ่านการตรวจสอบแล้ว

การจัดการ Session Hijacking

บทความนี้กล่าวถึง Session Hijacking ซึ่งเป็นการขโมย Session ID เพื่อแอบอ้างเป็นผู้ใช้งาน และนำเสนอแนวทางการป้องกันหลัก 3 วิธี ได้แก่ การ regenerate Session ID เ...

การจัดการ Session Hijacking

Session Hijacking คือการที่ผู้ไม่ประสงค์ดีขโมย Session ID ของผู้ใช้งาน และใช้ Session ID นั้นเพื่อแอบอ้างเป็นผู้ใช้งานตัวจริง เข้าถึงข้อมูลและสิทธิ์ต่างๆ ที่ผู้ใช้งานนั้นมี ในบทเรียนนี้ เราจะมาเรียนรู้วิธีการป้องกัน Session Hijacking ด้วยเทคนิคต่างๆ ที่สามารถนำไปประยุกต์ใช้ได้จริง

Session Hijacking คืออะไร?

Session Hijacking เกิดขึ้นเมื่อผู้โจมตีสามารถเข้าถึง Session ID ของเหยื่อได้ ช่องทางที่ผู้โจมตีอาจใช้ในการขโมย Session ID มีหลายวิธี เช่น:

  • Cross-Site Scripting (XSS): หากเว็บไซต์มีช่องโหว่ XSS ผู้โจมตีสามารถใช้ JavaScript เพื่อดึง Session ID จาก Cookie ของผู้ใช้งาน
  • Man-in-the-Middle Attack (MitM): หากการเชื่อมต่อระหว่างผู้ใช้งานกับเว็บไซต์ไม่ได้เข้ารหัสด้วย HTTPS ผู้โจมตีที่อยู่บนเครือข่ายเดียวกันสามารถดักจับข้อมูลที่ส่งผ่านไปมา รวมถึง Session ID ได้
  • Session Fixation: ผู้โจมตีสร้าง Session ID ขึ้นมาเอง และหลอกให้ผู้ใช้งานใช้ Session ID นั้น
  • Malware: มัลแวร์ที่ติดตั้งบนเครื่องของผู้ใช้งานสามารถขโมย Session ID ได้

เมื่อผู้โจมตีได้ Session ID ไปแล้ว พวกเขาสามารถใช้ Session ID นั้นเพื่อปลอมตัวเป็นผู้ใช้งานและเข้าถึงบัญชีของผู้ใช้งานได้

วิธีการป้องกัน Session Hijacking

มีหลายวิธีที่เราสามารถใช้เพื่อป้องกัน Session Hijacking ได้แก่:

1. Regenerate Session ID

การ regenerate Session ID เป็นประจำ (หรือเมื่อมีการเปลี่ยนแปลงสิทธิ์ของผู้ใช้งาน เช่น หลังจากการ Login) เป็นวิธีที่สำคัญในการป้องกัน Session Hijacking การ regenerate Session ID จะทำให้ Session ID เก่าใช้งานไม่ได้ ซึ่งจะทำให้ผู้โจมตีที่ขโมย Session ID ไปก่อนหน้านี้ไม่สามารถใช้ Session ID นั้นได้อีกต่อไป

เหตุผลเชิงออกแบบ: การ regenerate Session ID ช่วยลดระยะเวลาที่ Session ID หนึ่งๆ มีโอกาสถูกขโมยไปใช้งาน Trade-off คืออาจทำให้ผู้ใช้งานถูก Logout ออกจากระบบในระหว่างการใช้งาน หาก regenerate Session ID บ่อยเกินไป แนวปฏิบัติที่ดีคือการ regenerate Session ID เมื่อมีการเปลี่ยนแปลงสิทธิ์ (เช่น Login, Logout, เปลี่ยนรหัสผ่าน) หรือ regenerate Session ID เป็นระยะๆ (เช่น ทุกๆ 30 นาที) หากระบบมีความสำคัญด้านความปลอดภัยสูง

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

<?php
session_start();

// Regenerate Session ID เมื่อ Login สำเร็จ
if (isset($_POST['username']) && isset($_POST['password'])) {
  // ตรวจสอบ username และ password
  if ($username == 'admin' && $password == 'password') {
    session_regenerate_id(true); // พารามิเตอร์ true จะลบ Session File เก่า
    $_SESSION['logged_in'] = true;
    $_SESSION['username'] = $username;
    // ...
  } else {
    // ...
  }
}

// Regenerate Session ID เป็นระยะ
if (isset($_SESSION['last_regenerate']) && time() - $_SESSION['last_regenerate'] > 1800) { // 30 นาที
  session_regenerate_id(true);
  $_SESSION['last_regenerate'] = time();
} else if (!isset($_SESSION['last_regenerate'])) {
    $_SESSION['last_regenerate'] = time();
}
?>

คำอธิบาย:

  • session_regenerate_id(true); เป็นฟังก์ชันที่ใช้ในการสร้าง Session ID ใหม่ พารามิเตอร์ true จะทำให้ Session ID เก่าถูกลบทิ้ง
  • เราทำการ regenerate Session ID เมื่อผู้ใช้งาน Login สำเร็จ และทุกๆ 30 นาที

2. ใช้ HTTPS

การใช้ HTTPS เป็นสิ่งจำเป็นสำหรับการป้องกัน Session Hijacking HTTPS จะเข้ารหัสการสื่อสารระหว่างผู้ใช้งานกับเว็บไซต์ ทำให้ผู้โจมตีไม่สามารถดักจับ Session ID ได้ หากการเชื่อมต่อไม่ได้เข้ารหัส

เหตุผลเชิงออกแบบ: HTTPS ช่วยป้องกัน Man-in-the-Middle Attack ซึ่งเป็นหนึ่งในวิธีการที่ผู้โจมตีใช้ในการขโมย Session ID Trade-off คืออาจมีค่าใช้จ่ายในการติดตั้ง SSL/TLS Certificate แต่ปัจจุบันมี Certificate ฟรีให้ใช้งานได้มากมาย แนวปฏิบัติที่ดีคือการบังคับให้ผู้ใช้งานเข้าถึงเว็บไซต์ผ่าน HTTPS เท่านั้น

การตั้งค่า HTTPS:

ในการใช้งาน HTTPS คุณจะต้องติดตั้ง SSL/TLS Certificate บน Web Server ของคุณ รายละเอียดในการติดตั้ง Certificate จะแตกต่างกันไปขึ้นอยู่กับ Web Server ที่คุณใช้ (เช่น Apache, Nginx)

หลังจากติดตั้ง Certificate แล้ว คุณจะต้องตั้งค่า Web Server ให้ redirect HTTP traffic ไปยัง HTTPS

ตัวอย่างการตั้งค่า .htaccess (Apache):

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%$1 [R=301,L]

3. ตั้งค่า Session Cookie อย่างปลอดภัย

การตั้งค่า Session Cookie อย่างถูกต้องสามารถช่วยป้องกัน Session Hijacking ได้ การตั้งค่าที่สำคัญมีดังนี้:

  • secure flag: กำหนดให้ Cookie สามารถส่งผ่าน HTTPS เท่านั้น
  • HttpOnly flag: กำหนดให้ Cookie ไม่สามารถเข้าถึงได้จาก JavaScript ป้องกัน XSS
  • SameSite attribute: ควบคุมว่า Cookie จะถูกส่งไปพร้อมกับ request ข้าม Domain หรือไม่ ช่วยป้องกัน CSRF (Cross-Site Request Forgery)

เหตุผลเชิงออกแบบ: การตั้งค่าเหล่านี้ช่วยลดโอกาสที่ Session ID จะถูกขโมยผ่านช่องทางต่างๆ เช่น XSS และ MitM Trade-off คืออาจทำให้เว็บไซต์ทำงานไม่ถูกต้องหากผู้ใช้งานไม่ได้เปิดใช้งาน HTTPS หรือ JavaScript แนวปฏิบัติที่ดีคือการตั้งค่าเหล่านี้เสมอเมื่อสร้าง Session Cookie

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

<?php
session_start();

// ตั้งค่า Session Cookie
ini_set('session.cookie_secure', true); // HTTPS only
ini_set('session.cookie_httponly', true); // No JavaScript access
ini_set('session.cookie_samesite', 'Strict'); // Strict or Lax (แนะนำ Strict)

// หรือใช้ session_set_cookie_params() ก่อน session_start()
session_set_cookie_params([
  'secure' => true,
  'httponly' => true,
  'samesite' => 'Strict',
]);

// ตรวจสอบว่า HTTPS ถูกใช้งานหรือไม่
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
    // บังคับให้ redirect ไปยัง HTTPS
    $redirectURL = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header("Location: ".$redirectURL);
    exit;
}

?>

คำอธิบาย:

  • ini_set() ใช้เพื่อกำหนดค่าต่างๆ ของ PHP runtime
  • session.cookie_secure กำหนดให้ Cookie สามารถส่งผ่าน HTTPS เท่านั้น
  • session.cookie_httponly กำหนดให้ Cookie ไม่สามารถเข้าถึงได้จาก JavaScript
  • session.cookie_samesite กำหนดค่า SameSite attribute เป็น 'Strict' ซึ่งป้องกัน CSRF ได้ดีที่สุด
  • ตรวจสอบว่า HTTPS ถูกใช้งานหรือไม่ หากไม่ ให้ redirect ไปยัง HTTPS

สรุป

การป้องกัน Session Hijacking เป็นสิ่งสำคัญในการรักษาความปลอดภัยของเว็บไซต์ของคุณ การ regenerate Session ID, การใช้ HTTPS และการตั้งค่า Session Cookie อย่างถูกต้องเป็นวิธีง่ายๆ ที่สามารถช่วยป้องกัน Session Hijacking ได้อย่างมีประสิทธิภาพ ในบทต่อไป เราจะเรียนรู้เกี่ยวกับการใช้ Prepared Statements กับ LIKE Operator

Office.in.th Custom Service

ต้องการพัฒนาระบบหรือปรับแต่งจากโครงสร้างนี้?

Office.in.th รับพัฒนาและออกแบบ Enterprise Web Application, API Integration และระบบบริหารงานภาครัฐ/เอกชน พร้อมการสนับสนุนระยะยาว

ดูบริการรับพัฒนาซอฟต์แวร์