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 จากผู้ใช้