ฟิลเตอร์ (Filter) PHP
- หน้าก่อน PHP Exception
- หน้าต่อไป MySQL นิยาย
ฟิลเตอร์ PHP ใช้สำหรับยืนยันและกรองข้อมูลที่มาจากแหล่งข้อมูลที่ไม่ปลอดภัย อย่างเช่น การเข้าข้อมูลของผู้ใช้
อะไรคือฟิลเตอร์ PHP?
ฟิลเตอร์ PHP ใช้สำหรับยืนยันและกรองข้อมูลที่มาจากแหล่งข้อมูลที่ไม่ปลอดภัย
การยืนยันและกรองการเข้าข้อมูลของผู้ใช้หรือข้อมูลที่กำหนดเองเป็นส่วนสำคัญของโปรแกรม web ทุกๆ โปรแกรม
จุดประสงค์ของการออกแบบเสริมฟิลเตอร์ PHP คือเพื่อทำให้การกรองข้อมูลง่ายและรวดเร็วขึ้น
ทำไมต้องใช้ฟิลเตอร์?
เกือบทุกๆ โปรแกรม web ต้องอาศัยการรับอุปกรณ์จากภายนอก ข้อมูลเหล่านี้ทั่วไปมาจากผู้ใช้งานหรือโปรแกรมอื่นๆ (เช่น บริการ web) ด้วยการใช้ฟิลเตอร์ คุณสามารถทำให้โปรแกรมได้รับรูปแบบข้อมูลที่ถูกต้องได้
คุณควรกรองข้อมูลภายนอกเสมอ!
การกรองป้อนข้อมูลเป็นหนึ่งในประเด็นความปลอดภัยสำคัญที่สุดของโปรแกรม
อะไรคือข้อมูลภายนอก?
- ข้อมูลป้อนจากฟอร์ม
- Cookies
- ตัวแปรบนเซิร์ฟเวอร์
- ผลลัพธ์การค้นหาฐานข้อมูล
ฟังก์ชันและตัวกรอง
ถ้าต้องการกรองตัวแปร โปรดใช้ฟังก์ชันกรองตัวแปรดังนี้:
- filter_var() - กรองตัวแปรเดี่ยวๆ ด้วยตัวกรองที่ระบุ
- filter_var_array() - กรองหลายตัวแปรด้วยตัวกรองที่เหมาะสมหรือต่างกัน
- filter_input - รับตัวแปรป้อนหนึ่ง และกรองมัน
- filter_input_array - รับหลายตัวแปรป้อน และกรองพวกเขาด้วยตัวกรองที่เหมาะสมหรือต่างกัน
ในตัวอย่างด้านล่างนี้ เราใช้ฟังก์ชัน filter_var() ในการตรวจสอบตัวเลข:
<?php $int = 123; if(!filter_var($int, FILTER_VALIDATE_INT)) { echo("Integer is not valid"); } else { echo("Integer is valid"); } ?>
รหัสบทด้วยตัวอย่างด้านบนใช้ตัวกรอง "FILTER_VALIDATE_INT" ในการกรองตัวแปร ตัวเลขนี้เป็นตัวเลขที่ถูกต้อง ดังนั้นการออกแสดงของรหัสบทจะเป็น: "Integer is valid"。
หากเราพยายามใช้ตัวแปรที่ไม่ใช่ตัวเลข การออกแสดงของเราจะเป็น: "Integer is not valid"。
ถ้าต้องการดูรายการฟังก์ชันและตัวกรองที่เต็มทั้งหมด โปรดเข้าเว็บไซต์ของเรา คู่มือ PHP Filter。
Validating และ Sanitizing
มีตัวกรองสองประเภท:
ตัวกรอง Validating:
- ใช้เพื่อตรวจสอบการป้อนข้อมูลของผู้ใช้
- กฎระเบียบรูปแบบที่เข้มงวด (เช่นการตรวจสอบ URL หรือ E-Mail)
- ถ้าประสบความสำเร็จ ก็จะกลับมาแสดงชนิดที่คาดหวัง ถ้าล้มเหลว ก็จะกลับมาแสดง FALSE
ตัวกรอง Sanitizing:
- ใช้เพื่ออนุญาตหรือห้ามตัวอักษรที่ระบุในข้อความ
- ไม่มีกฎระเบียบรูปแบบข้อมูล
- เลยกลับมาแสดงข้อความเป็นตัวอักษรเสมอ
ตัวเลือกและสัญญาณ
ตัวเลือกและสัญญาณใช้เพื่อเพิ่มตัวเลือกการกรองเพิ่มเติมต่อตัวกรองที่ระบุ
ตัวเลือกและสัญญาณมีตัวเลือกและสัญญาณต่างกัน
ในตัวอย่างด้านล่างนี้ เราใช้ filter_var() และตัวเลือก "min_range" และ "max_range" ในการตรวจสอบตัวเลข:
<?php $var=300; $int_options = array( "options"=>array ( "min_range"=>0, "max_range"=>256 ) ); if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)) { echo("Integer is not valid"); } else { echo("Integer is valid"); } ?>
เหมือนรหัสด้านบน ตัวเลือกต้องถูกจัดไว้ในตัวแปรที่มีชื่อว่า "options" หากใช้สัญญาณ ก็ไม่จำเป็นต้องจัดไว้ในตัวแปร
เพราะตัวเลขเป็น "300" มันไม่อยู่ในขอบเขตที่กำหนด การออกผลลัพธ์ของรหัสดังกล่าวจะเป็น "Integer is not valid"。
สำหรับรายการฟังก์ชันและฟิลเตอร์ที่เต็มที่ โปรดเข้าชม CodeW3C.com ที่ คู่มือ PHP Filterคุณสามารถเห็นทั้งหมดตัวเลือกและสัญญาณที่สามารถใช้ได้ของฟิลเตอร์
ยืนยันข้อมูล
ให้พยายามยืนยันข้อมูลที่ส่งมาจากฟอร์ม
สิ่งที่เราต้องทำแรกคือต้องยืนยันว่ามีข้อมูลที่เรากำลังหาหรือไม่
หลังจากนั้น เราใช้ฟังก์ชัน filter_input() ที่จะเข้ารหัสข้อมูลที่ส่งเข้ามา
ในตัวอย่างด้านล่างนี้ ตัวแปร "email" ถูกส่งไปยังหน้า PHP:
<?php if(!filter_has_var(INPUT_GET, "email")) { echo("Input type does not exist"); } else { if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) { echo "E-Mail is not valid"; } else { echo "E-Mail is valid"; } } ?>
การอธิบายตัวอย่าง
ตัวอย่างดังกล่าวมีตัวแปรหลังจากการเข้าถึง (email) ที่ถูกส่งด้วยวิธี "GET":
- ตรวจสอบว่ามีตัวแปรหลังจากการเข้าถึงชนิด "GET" ชนิด "email" หรือไม่
- ถ้ามีตัวแปรหลังจากการเข้าถึง ตรวจสอบว่ามันเป็นที่ยอมรับว่าเป็นที่ฉันทนอีเมล
ทำความสะอาดข้อมูลที่ส่งเข้ามา
ให้พยายามทำความสะอาด URL ที่ส่งมาจากฟอร์ม
สุดท้าย เราต้องทราบว่ามีข้อมูลที่เรากำลังหาหรือไม่
หลังจากนั้น เราใช้ฟังก์ชัน filter_input() ที่จะทำความสะอาดข้อมูลที่ส่งเข้ามา
ในตัวอย่างด้านล่างนี้ ตัวแปร "url" ถูกส่งไปยังหน้า PHP:
<?php if(!filter_has_var(INPUT_POST, "url")) { echo("Input type does not exist"); } else { $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL); } ?>
การอธิบายตัวอย่าง
ตัวอย่างดังกล่าวมีตัวแปรหลังจากการเข้าถึง (url) ที่ถูกส่งด้วยวิธี "POST":
- ตรวจสอบว่ามีตัวแปรหลังจากการเข้าถึงชนิด "POST" ชนิด "url" หรือไม่
- ถ้ามีตัวแปรหลังจากการเข้าถึงนี้ ทำการทำความสะอาด (ลบตัวอักษรที่ผิดกฎหมาย) และเก็บไว้ในตัวแปร $url
ถ้าตัวแปรหลังจากการเข้าถึงเหมือนนี้: "http://www.W3非o法ol.com.c字符n/" แล้ว $url ตัวแปรที่ทำความสะอาดแล้วควรเป็นแบบดังนี้:
http://www.codew3c.com/
ฟิลเตอร์การนำเข้าหลายตัว
ฟอร์มปกติประกอบด้วยหลายช่องใส่ข้อมูล เพื่อหลีกเลี่ยงการเรียกใช้ฟังก์ชัน filter_var หรือ filter_input มากเกินไป สามารถใช้ฟังก์ชัน filter_var_array หรือ filter_input_array
ในตัวอย่างนี้ เราใช้ฟังก์ชัน filter_input_array() ในการฟิลเตอร์ตัวแปร GET สามตัว ซึ่งได้รับตัวแปร GET คือชื่อ อายุ และที่อยู่อีเมล
<?php $filters = array ( "name" => array ( "filter"=>FILTER_SANITIZE_STRING ), "age" => array ( "filter"=>FILTER_VALIDATE_INT, "options"=>array ( "min_range"=>1, "max_range"=>120 ) ), "email"=> FILTER_VALIDATE_EMAIL, ); $result = filter_input_array(INPUT_GET, $filters); if (!$result["age"]) { echo("Age must be a number between 1 and 120.<br />"); } elseif(!$result["email"]) { echo("E-Mail is not valid.<br />"); } else { echo("User input is valid"); } ?>
การอธิบายตัวอย่าง
ตัวอย่างที่อยู่ด้านบนมีตัวแปรที่นำเข้าด้วยวิธี "GET" สามตัว (name, age และ email)
- ตั้งแนวแบบที่มีชื่อตัวแปรของตัวแปรที่นำเข้า และฟิลเตอร์ที่ใช้สำหรับตัวแปรที่ระบุ
- เรียกฟังก์ชัน filter_input_array ด้วยตัวแปรที่ระบุไว้ รวมถึงตัวแปรที่นำเข้าฝั่ง GET และแนวแบบที่ได้ตั้งไว้ก่อน
- ตรวจสอบตัวแปร $result ว่ามีตัวแปร "age" และ "email" ที่มีการใส่ข้อมูลผิดมา (ถ้ามีการใส่ข้อมูลผิด)
ตัวแปรที่สองของฟังก์ชัน filter_input_array() สามารถเป็นแนวแบบหรือรหัสบัตรฟิลเตอร์เดียว
ถ้าตัวแปรนี้เป็นรหัสบัตรเดียวของฟิลเตอร์ ฟิลเตอร์ที่ระบุนี้จะเซ็นข้อมูลทั้งหมดในแนวแบบที่นำเข้า
ถ้าตัวแปรนี้เป็นแนวแบบแบบรายการ แนวแบบนี้ต้องทำตามกฎที่ต่อไปนี้:
- ต้องเป็นแอร์เรย์ที่เป็นสายสาย ซึ่งมีตัวแปรป้อนเข้ามาเป็นกุญแจของแอร์เรย์ (เช่น "age" ตัวแปรป้อน)
- ค่าของแอร์เรย์นี้ต้องเป็น ID ของฟิลเตอร์ หรือแอร์เรย์ที่ระบุฟิลเตอร์ สัญญาณ และตัวเลือก
ใช้ Filter Callback
ด้วยการใช้ฟิลเตอร์ FILTER_CALLBACK คุณสามารถเรียกใช้ฟังก์ชันที่สร้างขึ้นเอง และใช้มันเป็นฟิลเตอร์ ดังนั้นเราจึงมีความควบคุมเต็มต่อการฟิลเตอร์ข้อมูล
คุณสามารถสร้างฟังก์ชันที่สร้างขึ้นเอง หรือใช้ฟังก์ชัน PHP ที่มีอยู่แล้ว
ระบุวิธีที่จะใช้ฟังก์ชันฟิลเตอร์ ตามระบุตัวแปรตัวเลือก
ในตัวอย่างข้างต้น เราใช้ฟังก์ชันที่สร้างขึ้นเองเพื่อแปลงทั้งหมด "_" ให้เป็นช่องว่าง
<?php function convertSpace($string) { return str_replace("_", " ", $string); } $string = "Peter_is_a_great_guy!"; echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace")); ?>
ผลลัพธ์ของโค้ดข้างต้นคือ
Peter คือคนที่ดีมาก!
การอธิบายตัวอย่าง
ตัวอย่างข้างต้นแปลงทั้งหมด "_" ให้เป็นช่องว่าง
- สร้างฟังก์ชันที่แทนที่ "_" ด้วยช่องว่าง
- เรียกใช้ฟังก์ชัน filter_var() ซึ่งมีตัวแปรที่เป็นฟิลเตอร์ FILTER_CALLBACK และตัวแปรแบบแอร์เรย์ที่มีฟังก์ชันของเรา
- หน้าก่อน PHP Exception
- หน้าต่อไป MySQL นิยาย