پالایه‌های فیلتر (Filter) در PHP

فیلترهای PHP برای تأیید و فیلتر کردن داده‌هایی از منابع غیر امن استفاده می‌شوند، مانند ورودی‌های کاربر.

فیلترهای PHP چیست؟

فیلترهای PHP برای تأیید و فیلتر کردن داده‌هایی از منابع غیر امن استفاده می‌شوند.

تأیید و فیلتر کردن ورودی‌های کاربران یا داده‌های سفارشی بخش مهمی از هر برنامه وب است.

هدف طراحی افزونه‌های فیلتر PHP این است که فرآیند فیلتر کردن داده‌ها را آسان‌تر و سریع‌تر کند.

چرا از فیلتر استفاده می‌کنیم؟

بقریب از تمامی برنامه‌های وب از ورودی‌های خارجی استفاده می‌کنند. این داده‌ها معمولاً از کاربران یا برنامه‌های دیگر (مانند خدمات وب) می‌آیند. با استفاده از فیلترها، شما می‌توانید اطمینان حاصل کنید که برنامه‌ها ورودی‌های صحیحی دریافت می‌کنند.

شما باید همیشه داده‌های خارجی را فیلتر کنید!

فیلتر کردن ورودی‌ها یکی از مهم‌ترین موضوعات امنیتی برنامه‌هاست.

چه داده‌های خارجی است؟

  • داده‌های ورودی فرم
  • کوکی‌ها
  • متغیرهای سرور
  • نتیجه جستجوی پایگاه داده

توابع و پالایه‌ها

برای فیلتر کردن متغیر، یکی از توابع زیر را استفاده کنید:

  • 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 Reference Manual.

تأیید و پاکسازی

دو نوع پالایه وجود دارد:

پالایه‌های تأیید:

  • برای تأیید ورودی کاربر استفاده می‌شود
  • قوانین فرمت دقیق (مثل تأیید URL یا ایمیل)
  • اگر موفق شود نوع مورد انتظار را بازمی‌گرداند، اگر شکست بخورد FALSE بازمی‌گرداند

پالایه‌های پاکسازی:

  • برای مجاز یا ممنوع کردن کاراکترهای مشخص شده در رشته استفاده می‌شود
  • بدون قوانین فرمت داده
  • همیشه یک رشته بازمی‌گرداند

تنظیمات و نشان‌ها

تنظیمات و نشان‌ها برای اضافه کردن تنظیمات اضافی به پالایه مشخص شده استفاده می‌شوند.

پالایه‌های مختلف有不同的 تنظیمات و نشان‌ها.

در مثال زیر، ما از 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 Reference Manualشما می‌توانید گزینه‌های قابل استفاده و تابع‌های فیلتر را در

بررسی ورودی

بیایید سعی کنیم ورودی‌ای که از فرم ارسال شده است را بررسی کنیم.

اولین کاری که باید انجام دهیم این است که بررسی کنیم که آیا داده‌های ورودی مورد نظر ما وجود دارد یا خیر.

سپس ما از تابع filter_input() برای فیلتر کردن داده‌های ورودی استفاده می‌کنیم.

در مثال زیر، متغیر ورودی "email" به صفحه PHP ارسال شده است:

<?php
if(!filter_has_var(INPUT_GET, "email"))
 {
 echo("نوع ورودی وجود ندارد");
 }
else
 {
 if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
  {
  echo "ایمیل معتبر نیست";
  }
 else
  {
  echo "ایمیل معتبر است";
  }
 }
?>

توضیح مثال:

در مثال بالا یک متغیر ورودی (email) از طریق روش "GET" ارسال شده است:

  1. بررسی کنید که آیا متغیر ورودی "email" نوع "GET" وجود دارد
  2. اگر متغیر ورودی وجود داشته باشد، بررسی کنید که آیا آن یک ایمیل معتبر است

پاکسازی ورودی

بیایید سعی کنیم URL‌ای که از فرم ارسال شده است را پاکسازی کنیم.

اول از همه، باید بررسی کنیم که آیا داده‌های ورودی مورد نظر ما وجود دارد یا خیر.

سپس، ما از تابع filter_input() برای پاکسازی داده‌های ورودی استفاده می‌کنیم.

در مثال زیر، متغیر ورودی "url" به صفحه PHP ارسال شده است:

<?php
if(!filter_has_var(INPUT_POST, "url"))
 {
 echo("نوع ورودی وجود ندارد");
 }
else
 {
 $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
 }
?>

توضیح مثال:

در مثال بالا یک متغیر ورودی (url) از طریق روش "POST" ارسال شده است:

  1. بررسی کنید که آیا متغیر ورودی "url" نوع "POST" وجود دارد
  2. اگر این متغیر ورودی وجود داشته باشد، آن را پاکسازی کنید (کاراکترهای غیرقانونی را حذف کنید) و آن را در متغیر $url ذخیره کنید

اگر متغیر ورودی مانند این باشد: "http://www.W3非法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("سن باید عددی بین 1 و 120 باشد.<br />");
 }
elseif (!$result["email"])
 {
 echo("ایمیل معتبر نیست.<br />");
 }
else
 {
 echo("ورودی کاربر معتبر است");
 }
?>

توضیح مثال:

در مثال بالا سه متغیر ورودی با روش "GET" ارسال شده‌اند (name، age و email).

  1. یک آرایه تنظیم کنید که شامل نام‌های متغیرهای ورودی و فیلترهای مشخص شده برای ورودی‌های مشخص شده باشد.
  2. دهمان filter_input_array() را فراخوانی کنید، با پارامترهای متغیرهای ورودی GET و آرایه‌ای که قبلاً تنظیم کرده‌اید.
  3. بررسی کنید که متغیر $result متغیرهای "age" و "email" را ورودی غیرقانونی دارد یا خیر. (اگر ورودی غیرقانونی وجود داشته باشد،)

دهمان filter_input_array() می‌تواند یک آرایه یا شناسه فیلتر واحد باشد.

اگر متغیر یک شناسه فیلتر واحد باشد، فیلتر مشخص شده همه مقادیر آرایه ورودی را فیلتر می‌کند.

اگر متغیر یک آرایه باشد، آن آرایه باید از قوانین زیر پیروی کند:

  • باید یک آرایه مرتبط باشد که شامل ورودی‌های متغیرهای آرایه (مثلاً ورودی متغیر "age") باشد
  • مقدارهای این آرایه باید شناسه فیلترها یا آرایه‌هایی باشند که شامل فیلترها، علامت‌ها و گزینه‌ها هستند

استفاده از Filter Callback

با استفاده از فیلتر FILTER_CALLBACK، می‌توان فنکشن‌های سفارشی را فراخوانی کرد و آن‌ها را به عنوان فیلتر استفاده کرد. به این ترتیب، ما کنترل کامل داده‌های فیلتر را داریم.

می‌توانید فنکشن‌های سفارشی خود را ایجاد کنید یا از فنکشن‌های موجود PHP استفاده کنید.

روش تعیین فیلترهای فنکشن‌ها مشابه روش تعیین گزینه‌ها است.

در مثال زیر، ما از یک فنکشن سفارشی استفاده کرده‌ایم که همه "_" را به فضای خالی تبدیل می‌کند:

<?php
فنکشن convertSpace($string)
{
return str_replace("_", " ", $string);
}
$string = "Peter_is_a_great_guy!";
echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>

نتیجه کد بالا به این صورت خواهد بود:

پیتر یک مرد بزرگ است!

توضیح مثال:

مثال بالا همه "_" را به فضای خالی تبدیل می‌کند:

  1. یک فنکشن ایجاد کنید که "_" را به فضای خالی تبدیل کند
  2. فیلتر var() را فراخوانی کنید، که پارامتر آن فیلتر FILTER_CALLBACK است و یک آرایه شامل فنکشن‌های ما را شامل می‌شود