سبد (0)

تبلیغات

فیلتر ورودی ها در PHP

فیلتر ورودی ها در php

Wiki

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

شما باید همیشه داده های ورودی را از فیلترها عبور دهید، در حقیقت فیلتر ورودی ها یکی از مهمترین مسائل امنیت برنامه هاست.

ورودی های برنامه کدامند؟

  • داده های دریافت شده از یک فرم HTML
  • Cookieها
  • داده های دریافت شده از وب سرویس ها
  • متغیرهایی که روی سرور ایجاد می شوند مثل sessionها
  • اطلاعاتی که از پایگاه داده بازیابی می شود

توابع و فیلترها

Wiki

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

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

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

<?php
$int = 123;

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

خروجی کد بالا:

Integer is valid

در کد بالا از صافی "FILTER_VALIDATE_INT" برای فیلتر کردن متغیر استفاده می کند.

اگر ما مثال بالا را با متغیری که integer نیست مثل "123abc" امتحان کنیم، خروجی چنین خواهد بود: "integer is not valid"

برای مشاهده لیست کامل توابع و فیلترها به بخش توابع کار با فیلترها در PHP مراجعه کنید.


معتبرسازی  و اصولی عمل کردن

Wiki

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

فیلترهای اعتبار سنجی:

  • برای معتبر کردن ورودی های کاربر استفاده می شوند.
  • برای قالب بندی قوانین محض استفاده می شود.(مثل معتبرسازی URL یا E-Mail)
  • اگر داده ورودی، اعتبار نداشته باشد FALSE وگرنه مقدار متغیر را بر می گرداند.

 فیلترهای اصولی:

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

گزینه ها و پرچم ها (optionها و flagها)

Wiki

 Optionها و flagها برای اضافه کردن شرط های خاص به فیلترها استفاده می شوند.

فیلترهای متفاوت، optionها و flagهای متفاوتی دارند.

مثال: در اینجا ما یک متغیر integer را با استفاده از ()filter_var و optionهای "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");
  }
?>

خروجی کد بالا:

Integer Is not valid

در کد بالا optionها باید در یک آرایه ی انجمنی با نام "options" قرار داده شوند. اگر یک flag استفاده می شود نیاز نیست که در آرایه قرار گیرد.

برای مشاهده لیست کامل توابع و فیلترها به بخش  توابع کار با فیلترها در PHP مراجعه کنید. بررسی کنید چه optionها و flagهایی برای هر فیلتر وجود دارد.


ورودی را معتبر کنید

Wiki

 اجازه دهید با یک مثال ورودی یک فرم را معتبر کنیم.

اولین کاری  که باید انجام دهیم این است که مطمئن شویم که داده ای که ما به دنبال آن هستیم وجود دارد یا نه.

سپس داده ی ورودی را با استفاده از تابع ()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. چک می کند که آیا متغیر ورودی "email" از نوع "GET" موجود هست
  2. اگر متغیر ورودی وجود داشته باشد٫ چک می کند که آیا یک آدرس ایمیل معتبر هست یا نه

ورودی را اصولی کنید

Wiki

 بیایید پاکسازی یک 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.Beååyamøøooz.com" متغیر url$ بعد از اصولی سازی به این شکل خواهد بود:

http://www.Beyamooz.com


فیلتر ورودی های چندگانه ی

Wiki

یک فرم HTML همیشه از بیش از یک فیلد ورودی تشکیل شده است. برای جلوگیری ازچندین بار فراخوانی توابع filter_var یا filter_input  ما می توانیم توابع filter_var_array یا filter_input_array را استفاده کنیم.

مثال: در این مثال ما تابع filter_input_array را برای فیلترکردن سه متغیر که با استفاده از متد 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");
  }
?>

توضیح مثال:

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

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

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

  • باید یک آرایه ی انجمنی باشد.(PHP Arrays)
  • کلید یا ایندکس آرایه باید با نام ورودی ها یکی باشد.
  • مقدار آرایه باید یک صافی خاص یا یک آرایه دیگر شامل صافی و flagها و optionها باشد.

صافی های تعریف شده توسط خودمان

Wiki

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

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

مثال: در مثال زیر٫ همه ی کاراکترهای "_" به خط فاصله تبدیل می شود:

<?php
function convertSpace($string)
{
return str_replace("_", " ", $string);
}

$string = "Peter_is_a_great_guy!";

echo filter_var($string, FILTER_CALLBACK,array("options"=>"convertSpace"));
?>

خروجی کد بالا:

Peter is a great guy!

توضیح مثال:

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

  1. یک تابع برای جایگزین کردن کاراکتر"_" به خط فاصه ایجاد می کند
  2. تابع ()filter_var را همراه با فیلتر FILTER_CALLBACK و یک آرایه شامل تابع مان فراخوانی می کند

برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.

دیدگاه‌ها  

+3 # آرمان 1396-01-29 19:32
سلام خداقوت.تو مثال فیلتر ورودی چندگانه برای name اومدین درادامه از ارایه استفاده کردین اما برای email بدون ارایه مستقیما فیلترشو نوشتین.دلیلش چی هست؟ممنون
$filters = array("name" => array("filter"= >FILTER_SANITIZ E_STRING),
"age" => array("filter"= >FILTER_VALIDAT E_INT,
"options"=>arra y("min_range"=> 1,"max_range"=> 120)),
"email"=> FILTER_VALIDATE _EMAIL);
پاسخ دادن | پاسخ به نقل قول | نقل قول کردن
+3 # امیر پهلوان صادق 1396-01-30 09:24
سلام
بله حق با شماست، در واقع می توان برای name مانند email عمل نمود.
به مثال زیر نیز دقت کنید:
<?php
$filters = array
(
"name" => array
(
"filter"=>FILTE R_CALLBACK,
"flags"=>FILTER _FORCE_ARRAY,
"options"=>"ucw ords"
),
"age" => array
(
"filter"=>FILTE R_VALIDATE_INT,
"options"=>arra y
(
"min_range"=>1,
"max_range"=>12 0
)
),
"email"=> FILTER_VALIDATE _EMAIL,
);
print_r(filter_input_array(INPUT_POST, $filters));
?>

خروجی مثال بالا:
Array
(
[name] => Peter
[age] => 41
[email] => [email protected]
)
پاسخ دادن | پاسخ به نقل قول | نقل قول کردن
+3 # آرمان 1396-01-29 01:51
سلام خداقوت.در مثال دوم, آیا می توان آرایه اولی را نیاورد؟ چون فقط یک آیتم options داره که خودش شامل آرایست. سوال دوم: من به جای options کلمه option هم که نوشتم خروجی میداد.یعنی فرقی نداره این دو کلمه؟
پاسخ دادن | پاسخ به نقل قول | نقل قول کردن
+3 # امیر پهلوان صادق 1396-01-29 12:27
سلام، لطفا یکبار دیگر به مثال توجه کنید:
$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");
}

توضیح خط دوم: در این خط با استفاده از یک آرایه انجمنی، سعی کرده ایم Optionها یا گزینه های فیلتر مورد نظرمان را تعریف کنیم. اما همان طور که حتما متوجه شده اید، این گزینه ها به ما کمک می کنند تا بررسی کنیم که ورودی ما عددی بین 0 تا 256 باشد.
پس برای مشخص کردن گزینه های فیلتر، مجبور هستیم که یک آرایه انجمنی، مثل بالا تعریف کنیم.
همچنین توجه داشته باشید که بجای نام options هر کلمه دلخواه دیگری را می توانید استفاده کنید.
پاسخ دادن | پاسخ به نقل قول | نقل قول کردن

آموزش صوتی PHP

بستن
مدرس:
سوال و جواب:

ابزاری که در پیش روی دارید یکی از ابزارهای بسیار کاربردی سایت بیاموز در زمینه آموزش است، این ابزار برای سهولت یادگیری شما کاربران محترم طراحی شده است.

فقط کافی است روی عنوان پاراگراف مورد نظرتان کلیک کنید تا پخش صدا آغاز شود ...!

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه پرداخت آنلاین - بانک اقتصاد نوین پرداخت آنلاین - بانک سامان
 
دوره های آموزشی راه اندازی کسب و کارهای اینترنتی
تبلیغات اینترنتی