ตัวกรอง PHP ใช้ในการตรวจสอบและกรองข้อมูลจากแหล่งที่ไม่ปลอดภัย เช่น ข้อมูลของผู้ใช้
ตัวกรอง PHP ใช้เพื่อตรวจสอบและกรองข้อมูลจากแหล่งที่ไม่ปลอดภัย
การทดสอบ การตรวจสอบ และการกรองอินพุตของผู้ใช้หรือข้อมูลที่กำหนดเองเป็นส่วนสำคัญของเว็บแอปพลิเคชันใดๆ
ส่วนขยายตัวกรองของ PHP ได้รับการออกแบบมาเพื่อให้การกรองข้อมูลง่ายและรวดเร็วยิ่งขึ้น
เว็บแอปพลิเคชันเกือบทั้งหมดอาศัยอินพุตจากภายนอก ข้อมูลนี้มักจะมาจากผู้ใช้หรือแอปพลิเคชันอื่นๆ (เช่น บริการบนเว็บ) เมื่อใช้ตัวกรอง คุณสามารถมั่นใจได้ว่าแอปพลิเคชันของคุณได้รับประเภทอินพุตที่ถูกต้อง
คุณควรกรองข้อมูลภายนอกเสมอ!
การกรองอินพุตเป็นหนึ่งในหัวข้อความปลอดภัยของแอปพลิเคชันที่สำคัญที่สุด
ข้อมูลภายนอกคืออะไร?
ป้อนข้อมูลจากแบบฟอร์ม
คุกกี้
ข้อมูลบริการเว็บ
ตัวแปรเซิร์ฟเวอร์
ผลลัพธ์การสืบค้นฐานข้อมูล
หากต้องการกรองตัวแปร ให้ใช้ฟังก์ชันตัวกรองอย่างใดอย่างหนึ่งต่อไปนี้
filter_var() - กรองตัวแปรเดียวผ่านตัวกรองที่ระบุ
filter_var_array() - กรองตัวแปรหลายตัวด้วยตัวกรองเดียวกันหรือต่างกัน
filter_input - รับตัวแปรอินพุตและกรอง
filter_input_array - รับตัวแปรอินพุตหลายตัวและกรองผ่านตัวกรองเดียวกันหรือต่างกัน
ในตัวอย่างต่อไปนี้ เราตรวจสอบจำนวนเต็มโดยใช้ฟังก์ชัน filter_var():
<?php $int = 123 ; ถ้า ( ! filter_var ( $int , FILTER_VALIDATE_INT ) ) - echo ( " ไม่ใช่จำนวนเต็มตาม กฎหมาย " ) ; อื่น - echo ( " เป็นจำนวนเต็มตาม กฎหมาย " ) ; -
รหัสข้างต้นใช้ตัวกรอง "FILTER_VALIDATE_INT" เพื่อกรองตัวแปร
หากเราพยายามใช้ตัวแปรที่ไม่ใช่จำนวนเต็ม (เช่น "123abc") ผลลัพธ์จะเป็น: "Integer is not valid"
หากต้องการดูรายการฟังก์ชันและตัวกรองทั้งหมด โปรดไปที่คู่มืออ้างอิงตัวกรอง PHP ของเรา
ตัวกรองมีสองประเภท:
กำลังตรวจสอบตัวกรอง:
ใช้เพื่อตรวจสอบการป้อนข้อมูลของผู้ใช้
กฎการจัดรูปแบบที่เข้มงวด (เช่น การตรวจสอบ URL หรืออีเมล)
ส่งคืนประเภทที่คาดหวังหากสำเร็จหรือ FALSE หากล้มเหลว
แผ่นกรองฆ่าเชื้อ:
ใช้เพื่ออนุญาตหรือห้ามอักขระที่ระบุในสตริง
ไม่มีกฎการจัดรูปแบบข้อมูล
ส่งคืนสตริงเสมอ
ตัวเลือกและแฟล็กใช้เพื่อเพิ่มตัวเลือกการกรองเพิ่มเติมให้กับตัวกรองที่ระบุ
ตัวกรองที่ต่างกันจะมีตัวเลือกและแฟล็กที่แตกต่างกัน
ในตัวอย่างต่อไปนี้ เราตรวจสอบจำนวนเต็มโดยใช้ filter_var() ด้วยตัวเลือก "min_range" และ "max_range":
<?php $var = 300 ; $int_options = อาร์เรย์ ( " ตัวเลือก " => อาร์เรย์ - " min_range " => 0 , " max_range " => 256 - ) ; ถ้า ( ! filter_var ( $var , FILTER_VALIDATE_INT , $int_options ) ) - echo ( " ไม่ใช่จำนวนเต็มตาม กฎหมาย " ) ; อื่น - echo ( " เป็นจำนวนเต็มตาม กฎหมาย " ) ; -
เช่นเดียวกับโค้ดด้านบน ตัวเลือกจะต้องใส่ลงในอาร์เรย์ที่เกี่ยวข้องที่เรียกว่า "ตัวเลือก" หากใช้แฟล็ก ไม่จำเป็นต้องอยู่ในอาร์เรย์
เนื่องจากจำนวนเต็มคือ "300" ซึ่งไม่อยู่ในช่วงที่ระบุ ผลลัพธ์ของโค้ดด้านบนจะเป็น:
ไม่ใช่จำนวนเต็มตามกฎหมาย
หากต้องการดูรายการฟังก์ชันและตัวกรองทั้งหมด โปรดไปที่คู่มืออ้างอิงตัวกรอง PHP ของเรา คุณสามารถดูตัวเลือกและแฟล็กที่ใช้ได้สำหรับตัวกรองแต่ละตัว
เรามาลองตรวจสอบอินพุตจากแบบฟอร์มกัน
สิ่งแรกที่เราต้องทำคือยืนยันว่าข้อมูลอินพุตที่เรากำลังมองหามีอยู่จริง
จากนั้นเราใช้ฟังก์ชัน filter_input() เพื่อกรองข้อมูลอินพุต
ในตัวอย่างต่อไปนี้ ตัวแปรอินพุต "อีเมล" จะถูกส่งผ่านไปยังหน้า PHP:
<?php ถ้า ( ! filter_has_var ( INPUT_GET , " อีเมล " ) ) - echo ( " ไม่มี พารามิเตอร์ อีเมล " ) ; อื่น - ถ้า ( ! filter_input ( INPUT_GET , " อีเมล " , FILTER_VALIDATE_EMAIL ) ) - เสียงสะท้อน " ไม่ใช่อีเมลที่ถูก ต้อง " ; อื่น - เสียงสะท้อน " เป็นอีเมลที่ถูก ต้อง " ; - -
ตัวอย่างข้างต้นมีตัวแปรอินพุต (อีเมล) ที่ส่งผ่านวิธีการ "GET":
ตรวจสอบว่ามีตัวแปรอินพุต "อีเมล" ประเภท "GET" หรือไม่
หากมีตัวแปรอินพุตอยู่ ให้ตรวจสอบว่าเป็นที่อยู่อีเมลที่ถูกต้องหรือไม่
ลองล้าง URL ที่ส่งมาจากแบบฟอร์ม
ขั้นแรก เราต้องการยืนยันว่าข้อมูลอินพุตที่เรากำลังมองหานั้นมีอยู่จริง
จากนั้นเราใช้ฟังก์ชัน filter_input() เพื่อกรองข้อมูลอินพุตให้บริสุทธิ์
ในตัวอย่างต่อไปนี้ ตัวแปรอินพุต "url" จะถูกส่งผ่านไปยังหน้า PHP:
<?phpif(!filter_has_var(INPUT_GET, "url")){ echo("ไม่มีพารามิเตอร์ url");}else{ $url = filter_input(INPUT_GET, "url", FILTER_SANITIZE_URL); echo $url;}?>
ตัวอย่างข้างต้นมีตัวแปรอินพุต (url) ที่ส่งผ่านวิธีการ "GET":
ตรวจสอบว่ามีตัวแปรอินพุต "url" ประเภท "GET" หรือไม่
หากมีตัวแปรอินพุตนี้อยู่ ให้ฆ่าเชื้อ (ลบอักขระที่ไม่ถูกต้อง) และเก็บไว้ในตัวแปร $url
หากตัวแปรอินพุตเป็นสตริงที่คล้ายกับสิ่งนี้: "http://www.ruåånoøøob.com/" ตัวแปร $url ที่ผ่านการฆ่าเชื้อแล้วจะมีหน้าตาดังนี้:
แบบฟอร์มมักประกอบด้วยช่องป้อนข้อมูลหลายช่อง เพื่อหลีกเลี่ยงการเรียกซ้ำไปยังฟังก์ชัน filter_var หรือ filter_input เราสามารถใช้ฟังก์ชัน filter_var_array หรือ filter_input_array ได้
ในตัวอย่างนี้ เราใช้ฟังก์ชัน filter_input_array() เพื่อกรองตัวแปร GET สามตัว ตัวแปร GET ที่ได้รับคือชื่อ อายุ และที่อยู่อีเมล:
<?php $ตัวกรอง = อาร์เรย์ - " name " => อาร์เรย์ - " ตัวกรอง " => FILTER_SANITIZE_STRING ) , " อายุ " => อาร์เรย์ - " filter " => FILTER_VALIDATE_INT , " options " => อาร์เรย์ - " min_range " => 1 , " max_range " => 120 - ) , " อีเมล " => FILTER_VALIDATE_EMAIL ) ; $ result = filter_input_array ( INPUT_GET , $filters ) ; ( ! $ผลลัพธ์ [ " อายุ " ] ) - echo ( " อายุต้องอยู่ระหว่าง 1 ถึง 120 <br> " ) ; elseif ( ! $result [ " อีเมล " ] ) - echo ( " อีเมลผิดกฎหมาย <br> " ) ; อื่น - echo ( " ป้อนข้อมูลถูก ต้อง " ) ; -
ตัวอย่างข้างต้นมีตัวแปรอินพุตสามตัว (ชื่อ อายุ และอีเมล) ที่ส่งผ่านเมธอด "GET":
ตั้งค่าอาร์เรย์ที่มีชื่อของตัวแปรอินพุตและตัวกรองสำหรับตัวแปรอินพุตที่ระบุ
เรียกใช้ฟังก์ชัน filter_input_array() พารามิเตอร์จะรวมตัวแปรอินพุต GET และอาร์เรย์ที่เพิ่งตั้งค่าไว้
ตรวจสอบว่าตัวแปร "อายุ" และ "อีเมล" ในตัวแปร $result มีข้อมูลที่ไม่ถูกต้องหรือไม่ (หากมีอินพุตไม่ถูกต้อง ตัวแปรอินพุตจะเป็น FALSE หลังจากใช้ฟังก์ชัน filter_input_array())
อาร์กิวเมนต์ที่สองของฟังก์ชัน filter_input_array() อาจเป็นอาร์เรย์หรือ ID ของตัวกรองเดียวก็ได้
หากพารามิเตอร์นี้เป็น ID ของตัวกรองเดียว ตัวกรองที่ระบุจะกรองค่าทั้งหมดในอาร์เรย์อินพุต
หากพารามิเตอร์เป็นอาร์เรย์ อาร์เรย์จะต้องเป็นไปตามกฎต่อไปนี้:
ต้องเป็นอาเรย์แบบเชื่อมโยงที่มีตัวแปรอินพุตที่เป็นคีย์ของอาเรย์ (เช่น ตัวแปรอินพุต "อายุ")
ค่าของอาร์เรย์นี้ต้องเป็น ID ของตัวกรอง หรืออาร์เรย์ที่ระบุตัวกรอง แฟล็ก และตัวเลือก
โดยใช้ตัวกรอง FILTER_CALLBACK คุณสามารถเรียกใช้ฟังก์ชันแบบกำหนดเองและใช้เป็นตัวกรองได้ ด้วยวิธีนี้ เราจึงสามารถควบคุมการกรองข้อมูลได้อย่างสมบูรณ์
คุณสามารถสร้างฟังก์ชันที่คุณกำหนดเองหรือใช้ฟังก์ชัน PHP ที่มีอยู่ได้
ระบุฟังก์ชันตัวกรองที่คุณต้องการใช้ในลักษณะเดียวกับตัวเลือกที่ระบุ ในอาเรย์แบบเชื่อมโยงที่มีชื่อว่า "ตัวเลือก"
ในตัวอย่างต่อไปนี้ เราใช้ฟังก์ชันแบบกำหนดเองเพื่อแปลง "_" ทั้งหมดเป็น ".":
<?php การทำงาน แปลง Space ( $string ) - กลับ str_replace ( " _ " , " . " , $ string ) ; $string = " www_codercto_com ! " ; filter_var ( $string , FILTER_CALLBACK , อาร์เรย์ ( " options " = > " ConvertSpace " ) ) ;
ตัวอย่างข้างต้นแปลงทั้งหมด "_" เป็น ".":
สร้างฟังก์ชันที่แทนที่ "_" ด้วย "."
เรียกใช้ฟังก์ชัน filter_var() ด้วยตัวกรอง FILTER_CALLBACK และอาร์เรย์ที่มีฟังก์ชันของเรา