ในการเขียนโปรแกรม PHP หนึ่งในเรื่องสำคัญที่เราต้องคำนึงถึงเสมอก็คือ ความปลอดภัยของข้อมูลที่รับเข้ามา (Input Validation) เพราะหากเราปล่อยให้ผู้ใช้ส่งข้อมูลเข้ามาโดยไม่มีการกรอง (Filtering) หรือการตรวจสอบความถูกต้อง (Validation) ก็อาจเปิดช่องให้เกิดช่องโหว่ทางด้านความปลอดภัย เช่น SQL Injection, XSS (Cross-Site Scripting), หรือข้อมูลที่ผิดพลาด ได้
โชคดีที่ PHP มีฟังก์ชันที่ช่วยให้เราสามารถกรองข้อมูล Input ได้ง่าย ๆ และมีประสิทธิภาพ นั่นก็คือ filter_var() วันนี้เราจะมาดูกันว่า filter_var() คืออะไร และใช้งานอย่างไรให้ปลอดภัย!
1. filter_var() คืออะไร?
filter_var() เป็นฟังก์ชันที่ใช้ในการกรองและตรวจสอบข้อมูล Input โดยเราสามารถใช้มันร่วมกับ Filter ที่มีอยู่แล้วใน PHP เพื่อทำให้แน่ใจว่าข้อมูลที่รับมานั้นอยู่ในรูปแบบที่ถูกต้อง
รูปแบบการใช้งาน
filter_var(ค่า, ตัวกรอง [, ตัวเลือกเสริม])
- ค่า (Value): ข้อมูลที่ต้องการตรวจสอบหรือกรอง
- ตัวกรอง (Filter): ประเภทของการกรองที่ต้องการใช้ เช่น กรองเป็นอีเมล, URL, ตัวเลข ฯลฯ
- ตัวเลือกเสริม (Options) [ไม่จำเป็น]: ใช้กำหนดเงื่อนไขเพิ่มเติมในการกรอง
2. ตัวกรองที่ใช้งานบ่อย
PHP มีตัวกรองที่ใช้กับ filter_var() อยู่หลายประเภท ซึ่งตัวที่นิยมใช้ ได้แก่:
2.1 กรองข้อมูลประเภทตัวเลข
ตรวจสอบว่าเป็นตัวเลขหรือไม่ (FILTER_VALIDATE_INT)
$number = "123";
if (filter_var($number, FILTER_VALIDATE_INT) !== false) {
echo "เป็นตัวเลขที่ถูกต้อง";
} else {
echo "ไม่ใช่ตัวเลข";
}
ตรวจสอบว่าเป็นตัวเลขทศนิยมหรือไม่ (FILTER_VALIDATE_FLOAT)
$float = "12.34";
if (filter_var($float, FILTER_VALIDATE_FLOAT) !== false) {
echo "เป็นตัวเลขทศนิยมที่ถูกต้อง";
} else {
echo "ไม่ใช่ตัวเลขทศนิยม";
}
2.2 กรองข้อมูลประเภทสตริง (String)
ลบอักขระที่ไม่จำเป็นออกจากข้อความ (FILTER_SANITIZE_STRING)
$input = "<h1>Hello, World!</h1>";
$clean = filter_var($input, FILTER_SANITIZE_STRING);
echo $clean; // Output: Hello, World!
หมายเหตุ: ตั้งแต่ PHP 8.1 FILTER_SANITIZE_STRING ถูกถอดออกไปแล้ว แนะนำให้ใช้ strip_tags() แทน
2.3 ตรวจสอบและกรองอีเมล
ตรวจสอบว่าเป็นอีเมลที่ถูกต้อง (FILTER_VALIDATE_EMAIL)
$email = "example@gmail.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "อีเมลถูกต้อง";
} else {
echo "อีเมลไม่ถูกต้อง";
}
กรองอีเมลให้สะอาด (FILTER_SANITIZE_EMAIL)
$dirty_email = "ex@am!ple@@gmail.com";
$clean_email = filter_var($dirty_email, FILTER_SANITIZE_EMAIL);
echo $clean_email; // Output: example@gmail.com
2.4 ตรวจสอบและกรอง URL
ตรวจสอบว่าเป็น URL ที่ถูกต้อง (FILTER_VALIDATE_URL)
$url = "https://www.example.com";
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo "URL ถูกต้อง";
} else {
echo "URL ไม่ถูกต้อง";
}
กรอง URL ให้สะอาด (FILTER_SANITIZE_URL)
$dirty_url = "https://www.ex@ampl!!e.com";
$clean_url = filter_var($dirty_url, FILTER_SANITIZE_URL);
echo $clean_url; // Output: https://www.example.com
2.5 ตรวจสอบและกรอง IP Address
ตรวจสอบว่าเป็น IPv4 หรือ IPv6 (FILTER_VALIDATE_IP)
$ip = "192.168.1.1";
if (filter_var($ip, FILTER_VALIDATE_IP)) {
echo "IP Address ถูกต้อง";
} else {
echo "IP Address ไม่ถูกต้อง";
}
3. ใช้ filter_var() ร่วมกับตัวเลือกเพิ่มเติม (Options)
บางกรณีเราต้องการกำหนดเงื่อนไขเพิ่มเติมให้กับ filter_var() เช่น กำหนดช่วงค่าของตัวเลข เป็นต้น
ตัวอย่างการกำหนดช่วงค่าด้วย FILTER_VALIDATE_INT
$options = array("options" => array("min_range" => 1, "max_range" => 100));
$number = 50;
if (filter_var($number, FILTER_VALIDATE_INT, $options)) {
echo "ตัวเลขอยู่ในช่วงที่กำหนด";
} else {
echo "ตัวเลขอยู่นอกช่วงที่กำหนด";
}
4. ใช้ filter_var() ในการกรองข้อมูล Form Input
$name = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
$age = filter_var($_POST['age'], FILTER_VALIDATE_INT, array("options" => array("min_range" => 1)));
if ($name && $email && $age) {
echo "ข้อมูลถูกต้อง!";
} else {
echo "กรุณากรอกข้อมูลให้ถูกต้อง";
}
สรุป
- filter_var() เป็นฟังก์ชันที่ใช้ในการกรองและตรวจสอบข้อมูล Input ได้ง่ายและปลอดภัย
- มีตัวกรอง (Filter) ให้ใช้มากมาย เช่น ตรวจสอบอีเมล, URL, หมายเลข IP, ตัวเลข ฯลฯ
- ใช้ FILTER_SANITIZE_ เพื่อล้างข้อมูลให้สะอาดก่อนนำไปใช้
- ใช้ FILTER_VALIDATE_ เพื่อตรวจสอบว่าข้อมูลอยู่ในรูปแบบที่ถูกต้องหรือไม่
- สามารถใช้ร่วมกับ Options เพื่อกำหนดเงื่อนไขเพิ่มเติม
การใช้ filter_var() จะช่วยให้โปรแกรมของคุณปลอดภัยขึ้น และลดความเสี่ยงจากข้อมูลที่ไม่พึงประสงค์ อย่าลืมใช้มันทุกครั้งที่รับ Input จากผู้ใช้!
ไม่มีความคิดเห็น:
แสดงความคิดเห็น