การรับข้อมูลจากผู้ใช้งานผ่านฟอร์มหรือ URL เป็นหนึ่งในจุดเสี่ยงที่สุดของการพัฒนาเว็บแอปพลิเคชัน หากไม่มีการกรองหรือแปลงข้อมูลก่อนนำไปแสดงผล แฮกเกอร์สามารถฉีดโค้ด JavaScript ที่เป็นอันตรายเข้ามารันบนเบราว์เซอร์ของผู้ใช้อื่นได้ ซึ่งการโจมตีนี้เรียกว่า XSS (Cross-Site Scripting)
ในภาษา PHP มีฟังก์ชันพื้นฐาน 2 ตัวที่นิยมใช้รับมือกับปัญหานี้ คือ htmlspecialchars() และ strip_tags() แต่ทั้งสองมีหลักการทำงานและจุดประสงค์ที่ต่างกันอย่างสิ้นเชิง บทความนี้จะพามาเจาะลึกการใช้งานอย่างถูกต้องครับ
ทำความรู้จัก XSS (Cross-Site Scripting)
XSS เกิดจากการที่ระบบนำข้อมูลที่ผู้ใช้ส่งเข้ามา (เช่น ความคิดเห็น, ชื่อผู้ใช้)ไปแสดงผลบนหน้าเว็บโดยตรงโดยไม่ได้ทำความสะอาด (Sanitize) หรือแปลงรหัส (Escape) ทำให้เบราว์เซอร์เข้าใจผิดว่าโค้ด <script>alert('Hacked!');</script> ที่ถูกส่งเข้ามาเป็นส่วนหนึ่งของ HTML และสั่งรันโค้ดนั้นทันที
htmlspecialchars() — เปลี่ยนแท็ก HTML ให้กลายเป็นข้อความธรรมดา
htmlspecialchars() ทำหน้าที่แปลงอักขระพิเศษของ HTML (เช่น <, >, ", ', &) ให้กลายเป็น HTML Entities (เช่น <, >) ทำให้เบราว์เซอร์แสดงผลตัวอักษรนั้นออกมาตรงๆ บนหน้าจอ โดยไม่รันแท็ก HTML นั้น ๆ
PHP
<?php
// ข้อมูลที่เป็นอันตรายจากผู้ใช้
$userInput = "<script>alert('XSS Attack!');</script>";
// แปลงอักขระพิเศษด้วย htmlspecialchars()
$safeOutput = htmlspecialchars($userInput, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
echo $safeOutput;
// ผลลัพธ์ใน HTML Source Code: <script>alert('XSS Attack!');</script>
// ผลลัพธ์ที่แสดงบนจอเบราว์เซอร์: <script>alert('XSS Attack!');</script> (แสดงเป็นข้อความ ไม่รันสคริปต์)
?>