ฟิลเตอร์ (Filter) PHP

ฟิลเตอร์ 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":

  1. ตรวจสอบว่ามีตัวแปรหลังจากการเข้าถึงชนิด "GET" ชนิด "email" หรือไม่
  2. ถ้ามีตัวแปรหลังจากการเข้าถึง ตรวจสอบว่ามันเป็นที่ยอมรับว่าเป็นที่ฉันทนอีเมล

ทำความสะอาดข้อมูลที่ส่งเข้ามา

ให้พยายามทำความสะอาด 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":

  1. ตรวจสอบว่ามีตัวแปรหลังจากการเข้าถึงชนิด "POST" ชนิด "url" หรือไม่
  2. ถ้ามีตัวแปรหลังจากการเข้าถึงนี้ ทำการทำความสะอาด (ลบตัวอักษรที่ผิดกฎหมาย) และเก็บไว้ในตัวแปร $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)

  1. ตั้งแนวแบบที่มีชื่อตัวแปรของตัวแปรที่นำเข้า และฟิลเตอร์ที่ใช้สำหรับตัวแปรที่ระบุ
  2. เรียกฟังก์ชัน filter_input_array ด้วยตัวแปรที่ระบุไว้ รวมถึงตัวแปรที่นำเข้าฝั่ง GET และแนวแบบที่ได้ตั้งไว้ก่อน
  3. ตรวจสอบตัวแปร $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 คือคนที่ดีมาก!

การอธิบายตัวอย่าง

ตัวอย่างข้างต้นแปลงทั้งหมด "_" ให้เป็นช่องว่าง

  1. สร้างฟังก์ชันที่แทนที่ "_" ด้วยช่องว่าง
  2. เรียกใช้ฟังก์ชัน filter_var() ซึ่งมีตัวแปรที่เป็นฟิลเตอร์ FILTER_CALLBACK และตัวแปรแบบแอร์เรย์ที่มีฟังก์ชันของเรา