GORAGOD.com

Web Security 101 — XSS (Cross-Site Scripting)

XSS คืออะไร ทำไมอันตราย?

  • XSS = การฝัง/ฉีดโค้ดฝั่ง client (JavaScript) ผ่าน input ที่ไม่ได้กรอง
  • attacker สามารถขโมย session, ทำ phishing, เปลี่ยน DOM, ทำ redirect

ประเภท XSS

  • Stored XSS — ข้อมูลอันตรายถูกเก็บใน DB แล้วแสดงต่อ (อันตรายสุด)
  • Reflected XSS — ข้อมูลจาก URL/form ถูกสะท้อนกลับใน response ทันที
  • DOM-based XSS — ปัญหาเกิดจาก JavaScript บนหน้าเว็บจัดการ DOM อย่างไม่ปลอดภัย

ตัวอย่าง (PHP) — Vulnerable vs Fixed

Vulnerable (อย่าใช้)

// รับจาก POST แล้วแสดงโดยตรง — อันตราย!
$message = $_POST['message'] ?? '';
echo "<div>User said: $message</div>";

Fixed — Escape ก่อนแสดง

$message = $_POST['message'] ?? '';
// ENT_QUOTES เพื่อแปลงทั้ง " และ ' , 'UTF-8' เพื่อความปลอดภัยของ encoding
$safe = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
echo "<div>User said: {$safe}</div>";

เพิ่มความปลอดภัยด้วย CSP (HTTP header)

// ตัวอย่าง header ที่ลดความเสี่ยง XSS เช่น ห้าม inline script และอนุญาตเฉพาะ script จาก origin เดียวกัน
header("Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none';");

Checklist ป้องกัน XSS

  • Escape / Encode ทุกครั้งก่อนส่งออกเป็น HTML (htmlspecialchars / template auto-escaping)
  • Validate input — แต่อย่าพึ่งแต่ validation (ยังต้อง escape)
  • ตั้ง Content-Security-Policy ที่เหมาะสม
  • หลีกเลี่ยง innerHTML / eval() ใน JS ถ้าเป็นไปได้ — ใช้ textContent หรือ DOM API แทน
  • เก็บ session id ใน HTTP-only cookie (ไม่ให้ JS อ่าน)
  • ทำ security review ในทุกฟอร์มที่รับ input จากผู้ใช้