Data Sanitization: การทำความสะอาดข้อมูลด้วย filter_var()
จากบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการตรวจสอบข้อมูล (Data Validation) เพื่อให้มั่นใจว่าข้อมูลที่รับเข้ามานั้นถูกต้องตามที่เราต้องการ ในบทนี้ เราจะมาเรียนรู้เกี่ยวกับการทำความสะอาดข้อมูล (Data Sanitization) เพื่อกำจัดข้อมูลที่ไม่พึงประสงค์หรือเป็นอันตรายออกไปก่อนที่จะนำไปใช้งานหรือจัดเก็บ
การทำความสะอาดข้อมูลมีความสำคัญอย่างยิ่ง โดยเฉพาะข้อมูลที่รับมาจากผู้ใช้ (User Input) เนื่องจากอาจมีข้อมูลที่เป็นอันตราย เช่น Code HTML หรือ Javascript ที่สามารถนำไปใช้ในการโจมตีเว็บไซต์ของเราได้ (Cross-Site Scripting - XSS)
ฟังก์ชัน filter_var() คืออะไร?
filter_var() เป็นฟังก์ชันใน PHP ที่ใช้สำหรับทั้งการตรวจสอบ (Validation) และการทำความสะอาด (Sanitization) ข้อมูล ฟังก์ชันนี้รับค่าข้อมูลและตัวกรอง (Filter) เป็นพารามิเตอร์ จากนั้นจะทำการตรวจสอบหรือทำความสะอาดข้อมูลตามตัวกรองที่ระบุ
ในบทนี้ เราจะเน้นไปที่การใช้งาน filter_var() ในการทำความสะอาดข้อมูล โดยจะครอบคลุมตัวกรองที่ใช้บ่อย 3 ตัว ได้แก่ FILTER_SANITIZE_STRING, FILTER_SANITIZE_EMAIL และ FILTER_SANITIZE_NUMBER_INT
FILTER_SANITIZE_STRING: ทำความสะอาดข้อมูลประเภทข้อความ
FILTER_SANITIZE_STRING เป็นตัวกรองที่ใช้สำหรับทำความสะอาดข้อมูลประเภทข้อความ โดยจะทำการลบแท็ก HTML, ลบหรือเข้ารหัสอักขระพิเศษ และตัดช่องว่าง (Whitespace) ที่ไม่จำเป็นออกไป
ข้อควรระวัง: FILTER_SANITIZE_STRING ใน PHP เวอร์ชั่น 7.3 และต่ำกว่า มีช่องโหว่ด้านความปลอดภัย ทำให้ไม่แนะนำให้ใช้ ใน PHP 8.0 ได้ถูกยกเลิกไปแล้ว ดังนั้นควรใช้ตัวเลือกอื่นที่ปลอดภัยกว่า เช่น htmlspecialchars() หรือ strip_tags() ร่วมกับ trim()
เนื่องจากข้อจำกัดข้างต้น เราจะแสดงตัวอย่างการใช้งาน htmlspecialchars() และ trim() แทน:
<?php
$input = "<p>Hello <script>alert('XSS');</script> World!</p>";
// ใช้ htmlspecialchars() เพื่อแปลงแท็ก HTML เป็น HTML entities
$sanitized_data = htmlspecialchars(trim($input), ENT_QUOTES, 'UTF-8');
echo "Original Data: " . $input . "<br>";
echo "Sanitized Data: " . $sanitized_data . "<br>";
?>
ผลลัพธ์:
Original Data: <p>Hello <script>alert('XSS');</script> World!</p><br>
Sanitized Data: <p>Hello <script>alert('XSS');</script> World!</p><br>
ในตัวอย่างนี้ htmlspecialchars() จะแปลง < เป็น <, > เป็น >, " เป็น " และ ' เป็น ' ซึ่งจะช่วยป้องกันการโจมตี XSS ได้
trim() จะช่วยตัดช่องว่างด้านหน้าและด้านหลังข้อความออกไป
FILTER_SANITIZE_EMAIL: ทำความสะอาดข้อมูลประเภทอีเมล
FILTER_SANITIZE_EMAIL เป็นตัวกรองที่ใช้สำหรับทำความสะอาดข้อมูลประเภทอีเมล โดยจะทำการลบอักขระที่ไม่ถูกต้องตามรูปแบบอีเมลออกไป
<?php
$email = "invalid.email@example..com";
$sanitized_email = filter_var($email, FILTER_SANITIZE_EMAIL);
echo "Original Email: " . $email . "<br>";
echo "Sanitized Email: " . $sanitized_email . "<br>";
?>
ผลลัพธ์:
Original Email: invalid.email@example..com<br>
Sanitized Email: invalid.email@example.com<br>
ในตัวอย่างนี้ FILTER_SANITIZE_EMAIL จะลบ . ที่ซ้ำกันออกไป เพื่อให้ได้อีเมลที่ถูกต้องตามรูปแบบมากขึ้น
ข้อควรระวัง: FILTER_SANITIZE_EMAIL ไม่ได้การันตีว่าอีเมลที่ได้นั้นถูกต้องตามรูปแบบ 100% แต่ช่วยลดโอกาสที่จะเกิดข้อผิดพลาดได้
FILTER_SANITIZE_NUMBER_INT: ทำความสะอาดข้อมูลประเภทจำนวนเต็ม
FILTER_SANITIZE_NUMBER_INT เป็นตัวกรองที่ใช้สำหรับทำความสะอาดข้อมูลประเภทจำนวนเต็ม โดยจะทำการลบอักขระที่ไม่ใช่ตัวเลข, เครื่องหมายบวก (+) และเครื่องหมายลบ (-) ออกไป
<?php
$number = "+123-456abc789";
$sanitized_number = filter_var($number, FILTER_SANITIZE_NUMBER_INT);
echo "Original Number: " . $number . "<br>";
echo "Sanitized Number: " . $sanitized_number . "<br>";
?>
ผลลัพธ์:
Original Number: +123-456abc789<br>
Sanitized Number: +123-456789<br>
ในตัวอย่างนี้ FILTER_SANITIZE_NUMBER_INT จะลบตัวอักษร abc ออกไป เพื่อให้เหลือเพียงตัวเลข เครื่องหมายบวก และเครื่องหมายลบ
ข้อควรระวัง: FILTER_SANITIZE_NUMBER_INT จะเก็บเครื่องหมายบวกและลบไว้ด้วย หากต้องการให้เป็นจำนวนเต็มบวกเท่านั้น อาจจะต้องใช้ฟังก์ชันเพิ่มเติม เช่น abs()
สรุป
การทำความสะอาดข้อมูล (Data Sanitization) เป็นขั้นตอนสำคัญในการพัฒนาเว็บไซต์และแอปพลิเคชัน เพื่อป้องกันข้อมูลที่ไม่พึงประสงค์และอันตรายจากการเข้ามาในระบบ filter_var() เป็นเครื่องมือที่มีประโยชน์ในการทำความสะอาดข้อมูลประเภทต่างๆ แต่ควรเลือกใช้ตัวกรองที่เหมาะสมและระมัดระวังในการใช้งาน เพื่อให้ได้ผลลัพธ์ที่ถูกต้องและปลอดภัย
ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับการป้องกัน SQL Injection ซึ่งเป็นภัยคุกคามที่ร้ายแรงต่อฐานข้อมูลของเรา