Filters
ครีม แสงทอง 640710493
ในภาษา PHP มีระบบที่เรียกว่า Filters ซึ่งช่วยให้เราสามารถ กรอง หรือ ตรวจสอบความถูกต้อง ของข้อมูลที่รับเข้ามา โดยเฉพาะข้อมูลที่เราไม่ทราบแหล่งที่มา เช่น ข้อมูลที่กรอกจากฟอร์มผู้ใช้ ซึ่งเป็นข้อมูลที่มาในรูปของฟอร์ม HTML ดังนั้น filters จึงถูกออกแบบมาเพื่อทำให้ข้อมูลของเรามีความปลอดภัยมากยิ่งขึ้น
ประเภทของ Filters
ประเภทของ filters ใน PHP มีอยู่ 2 ประเภทหลักๆ ได้แก่
1. Validation
คือ การตรวจสอบความถูกต้องของข้อมูลว่าตรงตามคุณสมบัติที่เราต้องการหรือไม่ โดยจะทำการแสดงผลออกมาว่า ข้อมูลนี้ถูกต้องหรือไม่ถูกต้อง แต่จะไม่ทำการเปลี่ยนแปลงข้อมูลนั้นๆ
validation filters
FILTER_VALIDATE_BOOLEAN
ใช้ตรวจสอบว่าค่าเป็น boolean หรือไม่
FILTER_VALIDATE_DOMAIN
ใช้ตรวจสอบว่าความยาวของป้ายชื่อโดเมนถูกต้องหรือไม่
FILTER_VALIDATE_EMAIL
ใช้ตรวจสอบว่าเป็นอีเมลที่ถูกต้องหรือไม่
FILTER_VALIDATE_FLOAT
ใช้ตรวจสอบว่าค่าเป็น float หรือไม่
FILTER_VALIDATE_INT
ใช้ตรวจสอบว่าค่าเป็นจำนวนเต็มหรือไม่
FILTER_VALIDATE_IP
ใช้ตรวจสอบค่าว่าเป็น IP address ที่ถูกต้องหรือไม่โดยเลือกได้เฉพาะ IPv4 หรือ IPv6
FILTER_VALIDATE_MAC
ใช้ตรวจสอบว่าค่าเป็น MAC address ที่ถูกต้องหรือไม่
FILTER_VALIDATE_REGEXP
ใช้สำหรับตรวจสอบว่าข้อมูลตรงตาม Regular Expression (RegEx) ที่กำหนดหรือไม่
FILTER_VALIDATE_URL
ใช้ตรวจสอบค่าว่าเป็น URL ที่ถูกต้องหรือไม่
2 . Sanitization
คือ การลบหรือกำจัดข้อมูลที่ไม่จำเป็นหรืออันตรายออกไป จาก input ที่รับเข้ามา โดย filter ประเภทนี้ อาจจะทำการเปลี่ยนแปลงข้อมูลโดยการลบอักขระที่ไม่ต้องการออกไป
sanitization filters
FILTER_SANITIZE_EMAIL
ใช้ลบอักขระที่ไม่อนุญาตในอีเมล
FILTER_SANITIZE_ENCODED
ใช้เพื่อเข้ารหัส URL สามารถลบหรือเข้ารหัสอักขระพิเศษได้ตามต้องการ
FILTER_SANITIZE_NUMBER_FLOAT
ใช้ลบตัวอักษรทั้งหมดยกเว้นตัวเลข ,จุดทศนิยม และเครื่องหมายบวกลบ
FILTER_SANITIZE_NUMBER_INT
ใช้ลบตัวอักษรทั้งหมดยกเว้นตัวเลข และเครื่องหมายบวกลบ
FILTER_SANITIZE_ADD_SLASHES
ใช้เพิ่มเครื่องหมาย slash
FILTER_SANITIZE_SPECIAL_CHARS
ใช้เข้ารหัสอักขระ HTML พิเศษ เช่น <, >
FILTER_SANITIZE_URL
ใช้ลบอักขระที่ไม่อนุญาตใน URL
Filter Function
ฟังก์ชันใน PHP ที่ใช้กับ filter ได้เแก่
filter_has_var
ใช้ตรวจสอบว่ามีตัวแปรประเภทที่ระบุอยู่หรือไม่
input_type คือค่าคงที่ที่กำหนดไว้ล่วงหน้าค่าหนึ่ง ได้แก่ INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER หรือ INPUT_ENV ในขณะที่พารามิเตอร์ var_name คือชื่อของตัวแปรที่จะตรวจสอบ ถ้ามีตัวแปรนั้นจะส่งคืนค่า true ถ้าไม่มีก็ส่งคืน false
ตัวอย่างโค้ด
ถ้าพบ ตัวแปร "email": จะแสดงข้อความ "Email found".
ถ้าไม่พบ ตัวแปร "email" (เช่น URL ไม่มีพารามิเตอร์ email): จะแสดงข้อความ "Email not found".
output :
ถ้า input เป็น http://localhost/hello.php?email=abc@example.com
filter_id
ส่งคืน ID ของตัวกรองของชื่อตัวกรองที่ระบุ
ฟังก์ชันนี้จะทำการรับ $filtername เข้ามา ซึ่ง $filtername จะต้องเป็น string ที่ตรงกับชื่อของ filter ที่รองรับในภาษา PHP เท่านั้น เช่น FILTER_VALIDATE_EMAIL หรือ FILTER_SANITIZE_URL ถ้าหาก $filtername ถูกต้อง จะส่งค่า ID ของ filter นั้นออกไป แต่ถ้าไม่มีหรือไม่ถูกต้องจะคืนค่า False
ตัวอย่างโค้ด
โค้ดนี้จะทำการคืนค่า ID ของตัวกรอง FILTER_VALIDATE_EMAIL
output :
filter_input
รับตัวแปรภายนอกเฉพาะแค่ตัวแปรตามชื่อและกรองตามค่าคงที่ของ filter ที่ใช้
พารามิเตอร์ type จะต้องเป็นค่าคงที่ เช่น INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, หรือ INPUT_ENV ส่วนพารามิเตอร์ var_name คือชื่อของตัวแปรที่ต้องการดึงข้อมูล หากไม่ระบุ filter จะใช้ตัวกรองค่าเริ่มต้น (FILTER_DEFAULT)
ฟังก์ชันนี้จะคืนค่าตัวแปรที่ร้องขอถ้าสำเร็จ ถ้าตัวกรองไม่ผ่านจะคืนค่า false และถ้าตัวแปร var_name ไม่ถูกตั้งค่า จะคืนค่า null
ตัวอย่างโค้ด
โค้ดนี้ใช้ฟังก์ชัน filter_input() เพื่อตรวจสอบความถูกต้องของอีเมลที่ส่งมาผ่านการร้องขอแบบ GET และกรองข้อมูลด้วยตัวกรอง FILTER_VALIDATE_EMAIL ถ้าอีเมลไม่ถูกต้อง จะพิมพ์ข้อความว่า "Email is not valid" ถ้าอีเมลถูกต้อง จะพิมพ์ข้อความว่า "Email is valid"
output :
ถ้า input เป็น http://localhost/hello.php?email=abc@example.com
ถ้า input เป็น http://localhost/hello.php? email=abc@example.com
filter_input_array
รับตัวแปรภายนอกและสามารถกรองตัวแปรได้ทีละหลายๆฟิลล์พร้อมกันในรูปแบบของ array
พารามิเตอร์ $type คือประเภทข้อมูล เช่น INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, หรือ INPUT_ENV
พารามิเตอร์ที่สองคืออาร์เรย์ที่ประกอบด้วยชื่อของตัวแปร (คีย์) และประเภทตัวกรอง (ค่า) ที่ต้องการใช้ หรืออาจจะเป็นค่าคงที่ของตัวกรอง
ฟังก์ชันจะคืนค่าอาร์เรย์ของตัวแปรที่ร้องขอ ถ้าไม่มีข้อมูลจะคืนค่า null หากไม่ได้ตั้งค่าแฟล็ก FILTER_NULL_ON_FAILURE หรือคืนค่า false หากเกิดความล้มเหลวอื่นๆ.
ตัวอย่างโค้ด
เพื่อรวม arrayในคำขอ HTTP เราจะใช้แบบฟอร์ม HTML ต่อไปนี้ใน "hello.html" และส่งโดยใช้เมธอด POST
โค้ดที่ใช้ filter_input_array ในการตรวจสอบ
โค้ดนี้ใช้ filter_input_array() เพื่อกรองข้อมูลที่ส่งมาผ่านการร้องขอแบบ POST โดยใช้อายุและอีเมลเป็นตัวกรอง
ฟิลด์ age: ใช้ตัวกรอง FILTER_VALIDATE_INT พร้อมกำหนดช่วงอายุระหว่าง 20 ถึง 40 ปี
ฟิลด์ email: ใช้ตัวกรอง FILTER_VALIDATE_EMAIL เพื่อตรวจสอบความถูกต้องของอีเมล
ทำการใช้แบบฟอร์ม HTML ข้างต้น และป้อนอายุเป็น 30 และป้อน abc@example.com เป็นอีเมล ผลลัพธ์จะเป็นอาร์เรย์ โดยตรวจสอบความถูกต้องของอินพุตทั้งสองรายการ
output :
ลองใส่ค่าที่ไม่ถูกต้อง เช่น "age=15" อาร์เรย์เอาต์พุตจะแสดงค่าว่างสำหรับคีย์age
filter_list
จะทำการส่งคืนรายการ filter ที่รองรับทั้งหมด
ฟังก์ชันนี้จะส่งคืน array ของชื่อของ filters ที่รองรับทั้งหมด และส่งคืน array ว่างเปล่าถ้าไม่มี filter ดังกล่าว
ตัวอย่างโค้ด
output :
filter_var
เป็นฟังก์ชันที่พบได้บ่อย ใช้กรองตัวแปรด้วย filter ที่ระบุ โดยที่ฟังก์ชันนี้สามารถใช้ได้กับการ validate และ sanitize
$value คือ ค่าที่ต้องการกรอง (อาจเป็น string หรือ mixed)
$filter คือ ประเภทของตัวกรอง เช่น FILTER_VALIDATE_EMAIL, FILTER_SANITIZE_STRING (ค่าเริ่มต้นคือ FILTER_DEFAULT)
$options คือ ตัวเลือกเพิ่มเติม เช่น แฟล็กหรืออาร์เรย์ที่กำหนดการทำงานของตัวกรอง
ฟังก์ชันนี้คืนค่าผลลัพธ์ที่ทำการกรองแล้ว หากการกรองล้มเหลว จะส่งคืน false.
ตัวอย่างโค้ด
จากตัวอย่างนี้ใช้ฟังก์ชัน filter_var()เพื่อตรวจสอบว่าตัวแปร $int เป็นจำนวนเต็มหรือไม่ ถ้า $int เป็นจำนวนเต็ม ผลลัพธ์จะเป็น: "Integer is valid" หาก $int ไม่ใช่จำนวนเต็ม ผลลัพธ์จะเป็น: "Integer is not valid"
output :
filter_var_array
จะรับตัวแปรหลายตัวและสามารถกรองตัวแปรเหล่านั้นได้ (ตามตัวเลือก) โดยที่เราไม่ต้องเรียก filter_var() หลายครั้ง
พารามิเตอร์ data_array อาร์เรย์ที่มีคีย์แบบสตริง ซึ่งระบุข้อมูลที่ต้องการกรอง
พารามิเตอร์ args (ไม่บังคับ) เป็นอาร์เรย์ที่ระบุตัวกรอง โดยคีย์ที่ถูกต้องคือชื่อตัวแปร และค่าคือ ID ของตัวกรอง หรืออาร์เรย์ที่ระบุตัวกรอง แฟล็ก และตัวเลือก หากใช้ ID ตัวกรองเพียงตัวเดียว ค่าทั้งหมดในอาร์เรย์จะถูกกรองด้วยตัวกรองนั้น
พารามิเตอร์ add_empty (ไม่บังคับ): ถ้า TRUE คีย์ที่หายไปจะถูกเพิ่มเป็น NULL ค่าเริ่มต้นคือ TRUE
ตัวอย่างโค้ด
โค้ดนี้ใช้ฟังก์ชัน filter_var_array() เพื่อกรองข้อมูลในอาร์เรย์ โดยที่ในโค้ดนี้ไม่มีการกำหนดตัวกรองเฉพาะ ดังนั้นจะใช้ค่าเริ่มต้นของ FILTER_DEFAULT ซึ่งหมายความว่าข้อมูลทั้งหมดจะไม่ถูกกรองแต่จะส่งค่าเดิมเป็น output
output :
เปรียบเทียบ Filter ใน PHP กับภาษาอื่น
มีระบบ filter ที่สามารถใช้ฟังก์ชันเช่น filter_var(), filter_input(), และ filter_has_var() เพื่อกรองและตรวจสอบความถูกต้องของข้อมูลที่รับมาได้
ไม่มีฟังก์ชันกรองข้อมูลในตัว แต่ใช้ฟังก์ชันเช่น strtok() และ sscanf() เพื่อจัดการข้อมูลแทน
ใช้ java.util.regex สำหรับการกรองข้อมูล เช่น ตรวจสอบอีเมลหรือหมายเลขโทรศัพท์
มีโมดูล re สำหรับการใช้ Regular Expressions และฟังก์ชันต่างๆ ใน str เพื่อตรวจสอบข้อมูล
ใช้ Regular Expressions ในการกรองข้อมูล เช่น การตรวจสอบอีเมลและค่าต่างๆ ในฟอร์ม
เปรียบเทียบโค้ดในการกรองข้อมูล email ที่ถูกต้องของแต่ละภาษา
โค้ดนี้ใช้ฟังก์ชัน filter_input() ใน PHP เพื่อตรวจสอบและกรองข้อมูลจากการร้องขอแบบ GET โดยตรวจสอบตัวแปร "email" ว่าถูกต้องตามรูปแบบอีเมลหรือไม่ ด้วยตัวกรอง FILTER_VALIDATE_EMAIL
โค้ดนี้ใช้ในการตรวจสอบว่าอีเมลที่ผู้ใช้ป้อนมีสัญลักษณ์ @ หรือไม่ โดยมีขั้นตอนดังนี้:
รับค่าอีเมลจากผู้ใช้ผ่านฟังก์ชัน
fgets().ใช้ฟังก์ชัน
strchr()เพื่อตรวจสอบว่ามีสัญลักษณ์@อยู่ในอีเมลหรือไม่.ถ้ามี
@จะแสดงข้อความว่า "Email is valid."ถ้าไม่มี
@จะแสดงข้อความว่า "Email is not valid."
โค้ดนี้ ใช้สำหรับตรวจสอบว่าอีเมลเป็นรูปแบบที่ถูกต้องหรือไม่ โดยมีขั้นตอนดังนี้:
กำหนดอีเมลที่ต้องการตรวจสอบในตัวแปร
email.ใช้ Regular Expression (regex) สำหรับการตรวจสอบรูปแบบอีเมล ซึ่งอีเมลต้องประกอบด้วยอักขระที่ถูกต้องและมีโดเมนที่ถูกต้องตามหลักการ.
ใช้
PatternและMatcherเพื่อตรวจสอบว่าอีเมลตรงกับรูปแบบที่กำหนดหรือไม่.ถ้าอีเมลถูกต้องตามรูปแบบ จะแสดง
"Email is valid."ถ้าไม่ตรง จะแสดง
"Email is not valid."
โค้ดนี้ใช้ Regular Expression (regex) เพื่อตรวจสอบว่าอีเมลมีรูปแบบที่ถูกต้องหรือไม่:
กำหนดอีเมลที่ต้องการตรวจสอบในพารามิเตอร์ email
ใช้ regex pattern เพื่อตรวจสอบอีเมลที่ประกอบด้วยอักขระที่ถูกต้องและโดเมนที่ถูกต้องตามหลักการ
ฟังก์ชัน
re.match()ใช้เพื่อตรวจสอบว่าอีเมลตรงตามรูปแบบที่กำหนดหรือไม่ถ้าตรง: จะแสดง
"Email is valid."ถ้าไม่ตรง: จะแสดง
"Email is not valid."
โค้ดนี้ใช้ regular expression เพื่อตรวจสอบว่าอีเมลที่เก็บในตัวแปร email เป็นอีเมลที่ถูกต้องตามรูปแบบหรือไม่:
patternคือ Regular Expression ที่ใช้ตรวจสอบรูปแบบของอีเมลฟังก์ชัน
pattern.test(email)จะตรวจสอบว่าอีเมลตรงตามรูปแบบหรือไม่
Output :
Reference
Type of Filters : PHP.net. (n.d.). Types of filters [PHP.net]. PHP.net
Filter Function : PHP.net. (n.d.). Filter Function [PHP.net]. PHP.net
ตัวอย่าง code ใน Filter Function : Tutorialspoint. (n.d.). PHP – Filters [Tutorialspoint]. Tutorialspoint
filter_id() : Gekcho. (2022, 29 Dec).PHP | filter_id() Function [geeksforgeeks]. geeksforgeeks
filter_var() : W3Schools. (n.d.). PHP Filters [W3Schools]. W3Schools
JavaScript : MDN Web Docs. (n.d.). Regular Expressions (JavaScript) [Mozilla]. MDN Web Docs.
C : cplusplus.com. (n.d.). strchr function [cplusplus.com]. cplusplus.com
Java : Oracle. (n.d.). Regular Expressions Tutorial [Oracle Documentation]. Oracle Documentation
Python : Python Software Foundation. (n.d.). re — Regular expression operations [Python Documentation]. Python Documentation
Slide
Video
Last updated