filterFilters

ครีม แสงทอง 640710493

ในภาษา PHP มีระบบที่เรียกว่า Filters ซึ่งช่วยให้เราสามารถ กรอง หรือ ตรวจสอบความถูกต้อง ของข้อมูลที่รับเข้ามา โดยเฉพาะข้อมูลที่เราไม่ทราบแหล่งที่มา เช่น ข้อมูลที่กรอกจากฟอร์มผู้ใช้ ซึ่งเป็นข้อมูลที่มาในรูปของฟอร์ม HTML ดังนั้น filters จึงถูกออกแบบมาเพื่อทำให้ข้อมูลของเรามีความปลอดภัยมากยิ่งขึ้น

ประเภทของ Filters

ประเภทของ filters ใน PHP มีอยู่ 2 ประเภทหลักๆ ได้แก่

1. Validation

คือ การตรวจสอบความถูกต้องของข้อมูลว่าตรงตามคุณสมบัติที่เราต้องการหรือไม่ โดยจะทำการแสดงผลออกมาว่า ข้อมูลนี้ถูกต้องหรือไม่ถูกต้อง แต่จะไม่ทำการเปลี่ยนแปลงข้อมูลนั้นๆ

  • validation filters

ID
Description

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

ID
Description

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 ได้เแก่

  1. 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

  1. filter_id

ส่งคืน ID ของตัวกรองของชื่อตัวกรองที่ระบุ

ฟังก์ชันนี้จะทำการรับ $filtername เข้ามา ซึ่ง $filtername จะต้องเป็น string ที่ตรงกับชื่อของ filter ที่รองรับในภาษา PHP เท่านั้น เช่น FILTER_VALIDATE_EMAIL หรือ FILTER_SANITIZE_URL ถ้าหาก $filtername ถูกต้อง จะส่งค่า ID ของ filter นั้นออกไป แต่ถ้าไม่มีหรือไม่ถูกต้องจะคืนค่า False

  • ตัวอย่างโค้ด

โค้ดนี้จะทำการคืนค่า ID ของตัวกรอง FILTER_VALIDATE_EMAIL

output :

  1. 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

  1. 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

  1. filter_list

จะทำการส่งคืนรายการ filter ที่รองรับทั้งหมด

ฟังก์ชันนี้จะส่งคืน array ของชื่อของ filters ที่รองรับทั้งหมด และส่งคืน array ว่างเปล่าถ้าไม่มี filter ดังกล่าว

  • ตัวอย่างโค้ด

output :

  1. 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 :

  1. 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() เพื่อกรองและตรวจสอบความถูกต้องของข้อมูลที่รับมาได้

  • เปรียบเทียบโค้ดในการกรองข้อมูล email ที่ถูกต้องของแต่ละภาษา

โค้ดนี้ใช้ฟังก์ชัน filter_input() ใน PHP เพื่อตรวจสอบและกรองข้อมูลจากการร้องขอแบบ GET โดยตรวจสอบตัวแปร "email" ว่าถูกต้องตามรูปแบบอีเมลหรือไม่ ด้วยตัวกรอง FILTER_VALIDATE_EMAIL

Output :

Reference

Slide

Video

Last updated