PDA

View Full Version : آموزش: فيلتر در PHP



abdorreza
شنبه 12 شهریور 1390, 20:44 عصر
سلام دوستان

مطلبي را از سايت w3shools.com براي خودم ترجمه كردم كه گفتم اينجا قرار بدم تا دوستان ديگر هم ببينند و اگر مشكلي بود تذكر بدهند.

ممنون.

abdorreza
شنبه 12 شهریور 1390, 20:45 عصر
فيلتر PHP‌ چيست ؟
يك فيلتر PHP براي اعتبار سنجي و فيلتر داده هاي نا امن آمده از سوي منابع نا امن (مانند ورودي كاربر) استفاده ميشود.
براي بررسي ، اعتبار سنجي و فيلتر ورودي كاربر يا سفارشي كردن داده ها در بخش مهمي از هر برنامه ي تحت وب.
توسعه ي فيلتر PHP راهي است براي ساختن آسان و سريع فيلترينگ دادها.

چرا از فيلتر استفاده كينم؟
تقريبا همه ي برنامه هاي وب وابسته به ورودي خارجي هستند. معمولا اين ورودي از سوي يك كاربر يا برنامه هاي ديگر (مثل يك وب سرويس) ميباشد. با استفاده از فيلتر شما ميتوانيد مطمئن باشيد برنامه ي شما نوع صحيح ورودي را ميگيرد.
شما بايد هميشه همه ي داده هاي خارجي را فيلتر كنيد!
فيلترينگ ورودي يكي از مهمترين مسائل امنيتي برنامه است.

داده هاي خارجي چيست؟
• داده هاي ورودي از يك فرم
• كوكي ها
• داده هاي وب سرويس ها
• متغيرهاي سرور
• نتايج پرس و جوي پايگاه داده

abdorreza
شنبه 12 شهریور 1390, 20:49 عصر
توابع و فيلتر ها

براي فيلتر يك متغير ، از يكي از توابع زير استفاده ميكنيم :
• 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");
}
?>


اگر ما سعي كنيم براي متغيري كه عدد صحيح نيست (مثل 123abc) ، خروجي چنين خواهد بود : “Integer in not valid” .
كد بالا از فيلتر “FILTER_VALIDATE_INT” براي فيلتر متغير استفاده ميكند. پس از اينكه عدد صحيح معتبر بود خروجي كد بالا خواهد بود : “Integer is valid” .

abdorreza
شنبه 12 شهریور 1390, 20:53 عصر
اعتبار سنجي و اصول پاكسازي

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

فيلترهاي اعتبار سنجي:
• براي اعتبار سنجي ورودي كاربر استفاده ميشوند
• قوانين سخت براي فورمت ها (مثل اعتبار سنجي URL يا ايميل)
• بازگشت نوع انتظار در صورت موفقيت و FALSE در صورت عدم موفقيت

فيلترهاي مطابق با اصول پاكسازي:
• براي اجازه دادن و يا اجازه ندادن به كاراكرهايي مشخص در يك رشته استفاده ميشوند.
• فورمت قوانين بدون داده
• هميشه رشته برميگرداند

abdorreza
شنبه 12 شهریور 1390, 20:54 عصر
گزينه ها و فلگ ها

گزينه ها و فلگ ها براي اضافه كردن گزينه هاي فيلترينگ به فيلتر مشخص استفاده ميشوند.
فيلترهاي مختلف ، گزينه ها و فلگ هاي مختلفي دارند.

در مثال زير ، عدد صحيحي را با استفاده از 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");
}
?>


پس از اينكه عدد صحيح 300 در محدوده ي مشخص شده نبود ، خروجي كد بالا اين خواهد بود : “Integer in not valid”
مانند كد بالا ، گزينه ها بايد در يك آرايه ي انجمني با نام “options” قرار گيرند. اگر يك فلگ استفاده ميشود ، لازم نيست در آرايه باشد.

abdorreza
شنبه 12 شهریور 1390, 20:56 عصر
اعتبار سنجي ورودي

بگذاريد ورودي را از يك فرم اعتبار سنجي كنبم.

اولين چيزي كه براي تاييد داده هاي ورودي به آن نياز داريم ، وجود داشتن داده ي ورودي است.
سپس داده هاي ورودي را با استفاده از تابع filter_input() فيلتر ميكنيم.

در مثال زير ، متغير ورودي “emai” به صفحه ي 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. اگر متغير ورودي وجود داشت ، بررسي ميكند كه يك آدرس ايميل معتبر باشد

abdorreza
شنبه 12 شهریور 1390, 20:58 عصر
پاكسازي ورودي

بگذاريد يك 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.W3ååSchøøools.com/ باشد ، متغير $url بعد از پاكسازي چنين خواهد بود :


http://www.W3Schools.com/

abdorreza
شنبه 12 شهریور 1390, 21:00 عصر
فيلتر چندلايه (چندگانه) ورودي ها

يك فرم تقريبا هميشه شامل بيشتر از يك فيلد ورودي ميباشد. براي جلوگيري از فراخواني پي در پي توابع filter_var يا filter_input ميتوانيم او توابع filter_var_array يا filter_input_array استفاده كنيم.

در اين مثال از تابع filter_input_array() براي فيلتر سه متغير GET‌ استفاده ميكنيم. متغير هاي دريافت شده ي GET عبارتند از name ، age و email :


<?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. بررسي متغير هاي “age” و “email” در متغير $result براي معتبر بودن ورودي. (اگر هر يك از متغير هاي ورودي نا معتبر باشد ، آن متغير بعد از تابع filter_input_array() ، FALSE خواهد بود)

دومين پارامتر تابع filter_input_array() ميتواند يك آرايه يا يك آي دي فيلتر تك باشد.

اگر پارامتر يك آي دي فيلتر تك باشد ، همه ي مقادير در آرايه ي ورودي با فيلتر مشخص شده فيلتر ميشوند.


اگر پارامتر آرايه است بايد مطيع قوانين زير باشد :

• بايد يك آرايه ي انجمني شامل متغير ورودي به عنوان كليد آرايه باشد ( مانند متغير ورودي “age”)
• مقدار آرايه بايد يك آي دي فيلتر يا يك آرايه ي مخصوص فيلتر ، فلگ ها و گزينه ها داشته باشد.

abdorreza
شنبه 12 شهریور 1390, 21:02 عصر
استفاده از فيلتر Callback

اين امكاني است براي فراخواني يك تابع تعريف شده ي كاربر و استفاده از آن بعنوان يك فيلتر كه از فيلتر FILTER_CALLBACK استفاده ميكند. در اين روش ما يك كنترل كامل از فيلترينگ داده داريم.

شما ميتوانيد تابع شخصي خودتان را بسازيد و يا از تابع موجود PHP‌استفاده نماييد.

در تابع شما ميخواهيد از فيلتر مشخصي استفاده كنيد ، اين روش بعنوان يك گزينه مشخص شده است.در آرايه ي انجمني با نام “options”.
در مثال زير ، ما از يك تابع ساخته شده توسط كاربر براي تبديل همه ي كاراكترهاي “_” به كاراكتر جاي خالي “ “ استفاده كرده ايم:


<?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 و يك آرايه حاوي تابع ما