跳到主要内容

เนื้อหาภาษาไทย / 泰语内容

系统指南 内容已审核

Security Best Practices: Preventing XSS

บทความนี้อธิบายถึง Cross-Site Scripting (XSS) ซึ่งเป็นช่องโหว่ที่อนุญาตให้ผู้โจมตีแทรกสคริปต์อันตรายเข้าไปในเว็บไซต์ เพื่อขโมยข้อมูลหรือเปลี่ยนเส้นทางการเข้าชม...

Security Best Practices: Preventing XSS

ในบทที่แล้ว เราได้พูดถึง SQL Injection ซึ่งเป็นการโจมตีที่มุ่งเป้าไปยังฐานข้อมูล ในบทนี้ เราจะมาเจาะลึกอีกหนึ่งช่องโหว่ที่พบบ่อยและอันตรายไม่แพ้กัน นั่นคือ Cross-Site Scripting (XSS)

XSS คืออะไร?

Cross-Site Scripting (XSS) คือช่องโหว่ที่อนุญาตให้ผู้โจมตีแทรกสคริปต์ที่เป็นอันตราย (มักจะเป็น JavaScript) เข้าไปในเว็บไซต์ที่เหยื่อเข้าชม สคริปต์เหล่านี้จะถูกรันในเบราว์เซอร์ของผู้ใช้ ทำให้ผู้โจมตีสามารถขโมยข้อมูลส่วนตัว เช่น คุกกี้ ข้อมูลการเข้าสู่ระบบ หรือแม้กระทั่งเปลี่ยนเส้นทางการเข้าชมไปยังเว็บไซต์ที่เป็นอันตราย

XSS เกิดขึ้นเมื่อเว็บไซต์แสดงข้อมูลที่ผู้ใช้ป้อนเข้ามาโดยไม่ได้ตรวจสอบหรือทำการ sanitize อย่างเหมาะสม ทำให้สคริปต์ที่เป็นอันตรายถูกตีความว่าเป็นส่วนหนึ่งของเว็บไซต์

ประเภทของ XSS

XSS แบ่งออกเป็น 3 ประเภทหลักๆ:

  • Stored XSS (Persistent XSS): สคริปต์ที่เป็นอันตรายจะถูกเก็บไว้ในฐานข้อมูลหรือที่จัดเก็บอื่นๆ ของเว็บไซต์ ตัวอย่างเช่น ผู้โจมตีอาจโพสต์ความคิดเห็นที่มีสคริปต์อันตรายบนบล็อก เมื่อผู้ใช้คนอื่นๆ เข้ามาอ่านความคิดเห็นนั้น สคริปต์ก็จะถูกรัน
  • Reflected XSS (Non-Persistent XSS): สคริปต์ที่เป็นอันตรายจะถูกส่งไปยังเว็บไซต์ผ่านทาง URL หรือฟอร์ม แล้วเว็บไซต์ก็จะแสดงสคริปต์นั้นกลับไปยังผู้ใช้ ตัวอย่างเช่น ผู้โจมตีอาจส่งลิงก์ที่มีสคริปต์อันตรายใน query string ให้กับเหยื่อ เมื่อเหยื่อคลิกลิงก์ สคริปต์ก็จะถูกรัน
  • DOM-based XSS: สคริปต์ที่เป็นอันตรายจะถูกรันในฝั่ง client-side (เบราว์เซอร์) โดยใช้ JavaScript เพื่อแก้ไข Document Object Model (DOM) ของหน้าเว็บ ช่องโหว่นี้มักเกิดจาก JavaScript ที่ไม่ได้ตรวจสอบข้อมูลที่รับมาจากแหล่งต่างๆ เช่น URL hash หรือ localStorage อย่างเหมาะสม

การป้องกัน XSS

การป้องกัน XSS เป็นสิ่งสำคัญอย่างยิ่งสำหรับเว็บไซต์ทุกประเภท ต่อไปนี้คือแนวทางปฏิบัติที่ดีที่สุดในการป้องกัน XSS:

1. Escaping Output

Escaping Output คือการแปลงอักขระพิเศษในข้อมูลที่แสดงผล เพื่อให้เบราว์เซอร์ตีความอักขระเหล่านั้นเป็นข้อความธรรมดา ไม่ใช่เป็นส่วนหนึ่งของโค้ด HTML หรือ JavaScript

PHP มีฟังก์ชันมากมายสำหรับการ Escape Output ขึ้นอยู่กับบริบทที่ต้องการแสดงผล:

  • htmlspecialchars(): ใช้สำหรับ Escape ข้อมูลที่จะแสดงผลใน HTML attributes หรือ HTML content ฟังก์ชันนี้จะแปลงอักขระ &, ", ', <, และ > ให้เป็น HTML entities ที่เทียบเท่ากัน (เช่น &, ", ', <, และ >)
  • htmlentities(): คล้ายกับ htmlspecialchars() แต่จะแปลงอักขระทั้งหมดที่มี HTML entity ที่เทียบเท่ากัน
  • urlencode(): ใช้สำหรับ Escape ข้อมูลที่จะใช้ใน URL
  • json_encode(): ใช้สำหรับ Escape ข้อมูลที่จะใช้ใน JSON

ตัวอย่าง:

<?php
$username = $_GET['username']; // สมมติว่ารับค่า username จาก URL
$escapedUsername = htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
echo "<p>Welcome, " . $escapedUsername . "!</p>";
?>

ในตัวอย่างนี้ htmlspecialchars() จะป้องกันไม่ให้ผู้โจมตีแทรกสคริปต์ที่เป็นอันตรายใน username (เช่น <script>alert('XSS')</script>) โดยการแปลงเครื่องหมาย < และ > ให้เป็น HTML entities

เหตุผลเชิงออกแบบ: การเลือกใช้ htmlspecialchars(), htmlentities(), urlencode() หรือ json_encode() ขึ้นอยู่กับบริบทที่เราต้องการแสดงผลข้อมูล การใช้ฟังก์ชันที่ถูกต้องจะช่วยให้มั่นใจได้ว่าข้อมูลจะถูก Escape อย่างเหมาะสมและปลอดภัย

2. Content Security Policy (CSP)

Content Security Policy (CSP) คือกลไกที่ช่วยให้คุณสามารถควบคุมแหล่งที่มาของทรัพยากรที่เบราว์เซอร์สามารถโหลดได้ (เช่น สคริปต์, สไตล์ชีต, รูปภาพ, ฟอนต์) โดยการระบุไวท์ลิสต์ของแหล่งที่มาที่เชื่อถือได้

CSP ทำงานโดยการส่ง HTTP header ที่ชื่อ Content-Security-Policy พร้อมกับคำสั่งที่ระบุแหล่งที่มาที่อนุญาต:

ตัวอย่าง:

Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com

คำสั่งนี้บอกให้เบราว์เซอร์อนุญาตให้โหลดทรัพยากรทั้งหมดจากโดเมนเดียวกัน ('self') และอนุญาตให้โหลดสคริปต์และสไตล์ชีตจาก https://example.com เท่านั้น

การตั้งค่า CSP ใน PHP:

<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com");
?>

เหตุผลเชิงออกแบบ: CSP เป็นเครื่องมือที่มีประสิทธิภาพในการป้องกัน XSS โดยการจำกัดแหล่งที่มาของสคริปต์ที่เบราว์เซอร์สามารถรันได้ แม้ว่าผู้โจมตีจะสามารถแทรกสคริปต์ที่เป็นอันตรายเข้าไปในเว็บไซต์ได้ แต่ถ้าสคริปต์นั้นมาจากแหล่งที่มาที่ไม่ได้รับอนุญาตตาม CSP เบราว์เซอร์ก็จะปฏิเสธที่จะรันสคริปต์นั้น

3. Input Validation

Input Validation คือการตรวจสอบข้อมูลที่ผู้ใช้ป้อนเข้ามา เพื่อให้แน่ใจว่าเป็นไปตามรูปแบบและข้อจำกัดที่กำหนดไว้ Input Validation สามารถช่วยป้องกัน XSS ได้โดยการปฏิเสธข้อมูลที่ไม่ถูกต้องหรือข้อมูลที่มีสคริปต์ที่เป็นอันตราย

ตัวอย่าง:

<?php
$email = $_POST['email'];

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  echo "Invalid email format";
} else {
  // ดำเนินการต่อ
}
?>

ในตัวอย่างนี้ filter_var() จะตรวจสอบว่า email เป็นไปตามรูปแบบอีเมลที่ถูกต้องหรือไม่ ถ้าไม่ถูกต้อง ระบบก็จะแสดงข้อความแจ้งเตือน

เหตุผลเชิงออกแบบ: Input Validation ควรทำควบคู่ไปกับการ Escaping Output ไม่ใช่ใช้แทนกัน Input Validation ช่วยป้องกันไม่ให้ข้อมูลที่ไม่ถูกต้องเข้ามาในระบบ ในขณะที่ Escaping Output ช่วยป้องกันไม่ให้ข้อมูลที่เป็นอันตรายถูกรันในเบราว์เซอร์

สรุป

XSS เป็นช่องโหว่ที่อันตรายและพบบ่อย การป้องกัน XSS ต้องอาศัยการผสมผสานระหว่างเทคนิคต่างๆ เช่น Escaping Output, Content Security Policy (CSP) และ Input Validation การทำความเข้าใจหลักการเหล่านี้และการนำไปประยุกต์ใช้ในโค้ดของคุณ จะช่วยลดความเสี่ยงของการถูกโจมตีด้วย XSS ได้อย่างมาก

ในบทต่อไป เราจะพูดถึงการ Monitoring Application ซึ่งเป็นขั้นตอนสำคัญในการตรวจสอบและแก้ไขปัญหาที่เกิดขึ้นในระบบของคุณ

Office.in.th Custom Service

想基于此结构开发或定制系统?

Office.in.th 承接企业级 Web Application、API Integration 以及政府/企业管理系统的设计与开发,并提供长期支持。

查看软件开发服务