فیلترها در PHP

فیلتر PHP چیست؟

از فیلترهای PHP برای اعتبارسنجی و فیلتر کردن داده‌های حاصل از منابع ناامن مثل ورودی کاربر استفاده می شود. در واقع می‌توان گفت برای تست، اعتبار سنجی و فیلتر کردن ورودی کاربر یا داده‌های سفارشی، فیلتر بخش مهمی از هر وب اپلیکیشن است.

اکستنشن فیلتر PHP به گونه‌ای طراحی شده است که فیلترینگ داده‌ها را آسانتر و سریعتر انجام می دهد.

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

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

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

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

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

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

فانکشن‌ها و فیلترها

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

  • filter_var() : یک متغیر را با یک فیلتر مشخص، فیلتر می‌کند.
  • filter_var_array() : چندین متغیر را با فیلترهای یکسان یا متفاوت فیلتر می‌کند.
  • filter_input() : یک ورودی دریافت می‌کند و آن را فیلتر می‌کند.
  • filter_input_array() : چندین ورودی می‌گیرد و آن‌ها را با فیلتری یکسان یا فیلترهای متفاوت، فیلتر کنید.

به عنوان مثال، یک عدد صحیح را با استفاده از تابع filter_var() اعتبارسنجی می‌کنیم:

<?php
$int=1234;
if(!filter_var($int,FILTER_VALIDATE_INT))
{
echo "Integer is not valid";
} else {
echo "Integer is valid";
}

کد بالا از فیلتر FILTER_VALIDATE_INT برای فیلتر کردن متغیر استفاده می‌کند. از آنجا که عدد صحیح معتبر است،

خروجی

Integer is valid می‌شود.

اگر با متغیری غیر عدد صحیح (مثل "a1bc2") تست کنیم، خروجی "Integer is not valid" خواهد بود.

اعتبارسنجی و پاکسازی

دو نوع فیلتر وجود دارد:

اعتبارسنجی فیلترها (Validating Filters):

  • برای اعتبارسنجی ورودی کاربر استفاده می‌شوند.
  • قوانین فرمت دقیق (مانند اعتبار سنجی URL یا E-Mail)
  • در صورت موفقیت آمیز بودن، تایپ مورد انتظار را ریترن می‌کنند و در صورت عدم موفقیت، FALSE ریترن می‌کنند.

پاکسازی فیلترها (Sanitizing Filters):

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

آپشن‌ها و فلگ‌ها

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

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

با اینکه "300" عدد صحیح  است، اما در محدوده مشخص شده وجود ندارد و خروجی کد بالا Integer is not valid خواهد بود.

اعتبارسنجی ورودی

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

به عنوان مثال، متغیر ورودی "ایمیل" به صفحه 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 "Email is valid";
}
}

توضیحات مثال

مثال بالا دارای یک ورودی (ایمیل) است که با استفاده از متد GET به آن ارسال شده است:

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

Sanitize Input

قصد داریم 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. بررسی می‌کند که ورودی URL از نوع POST وجود دارد یا خیر.
  2. اگر متغیر ورودی وجود دارد، پاکسازی شود (کارکترهای نامعتبر را از بین ببرد) و آن را در متغیر url$ ذخیره کند.

اگر متغیر ورودی رشته‌ای مانند http://www.google.com/ باشد، متغیر url$ پس از پاکسازی به این شکل است: http://google.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 "Email is not valid.<br>";
} else {
 echo "User input is valid";
}

توضیحات مثال بالا

مثال بالا دارای سه ورودی (name، age و email) است که با استفاده از متد GET به آن ارسال شده‌اند.

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

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

اگر پارامتر آرایه‌ای از ID فیلترها باشد، باید این قوانین را دنبال کند:

  • باید یک آرایه انجمنی باشد که دارای متغیرهای ورودی به عنوان کلید آرایه باشد (مانند متغیر ورودی age)
  • مقدار آرایه باید آیدی فیلتر یا آرایه‌ای از آنها باشد که فیلتر، فلگ‌ها و آپشن‌ها را مشخص می‌کند.

استفاده از فیلتر Callback

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

می‌توانید خودتان یک فانکشن را تعریف کنید یا از فانکشن‌های تعریف شده در PHP استفاده کنید. فانکشنی که می‌خواهید برای فیلتر کردن استفاده کنید مشابه همان روشی است که برای یک آپشن مشخص می‌کنید. نام فانکشن در یک آرایه و با اندیس options مشخص می‌شود.

در مثال زیر ، از یک فانکشن ایجاد شده توسط کاربر برای تبدیل همه "_" به " " یا اصطلاحا وایت اسپیس‌ها استفاده می‌کنیم:

<?php
function convertSpace($string){
return  str_replace("_","",$string);
}
$string="Hi How are you";
echo filter_var($string,FILTER_CALLBACK,array("options"=>"convertSpace"));
?>

خروجی:

Hi How are you

توضیح مثال بالا:

خب همان طور که بالاتر گفتیم قرار بود این فانکشن تمام کارکترهای "_" را به " " تبدیل کنید.

  1. تابعی ایجاد کردیم که “_” را به فضای خالی تبدیل کند.
  2. فانکشن filter_var() را با فیلتر FILTER_CALLBACK و آرایه‌ای شامل فانکشن‌مان فراخوانی کردیم.
رقیه اباذری

رقیه اباذری

تو دانشگاه IT خوندم و اکثر منابع کتاب‌های ترجمه شده بودند و صدالبته مبهم :( مثلا element رو "عنصر" ترجمه می‌کردن و من همیشه می‌رفتم تو شیمی و جدول مندلیف. تو باورژن سعی کردم تا حد ممکن مطالب رو با زبان ساده و قابل درک بنویسم. باشد که کسانی که تازه پا به عرصه برنامه‌نویسی گذاشتن، راغب‌تر بشن و با نظرات و فیدبک‌های شما راه هموارتر بشه:)

دیدگاه‌ها


ثبت دیدگاه