فیلتر ورودی ها در PHP
فیلتر ورودی ها در php
تقریباً همه ی برنامه های تحت وب از محیط بیرون دریافت اطلاعات دارند که معمولاً این ورودی ها می تواند از طریق کاربران یا برنامه های دیگر مثل وب سرویس ها باشد، برای اطمینان از صحت اطلاعات ورودی، فیلترهای PHP کمک فراوانی به ما خواهند کرد.
شما باید همیشه داده های ورودی را از فیلترها عبور دهید، در حقیقت فیلتر ورودی ها یکی از مهمترین مسائل امنیت برنامه هاست.
ورودی های برنامه کدامند؟
- داده های دریافت شده از یک فرم HTML
- Cookieها
- داده های دریافت شده از وب سرویس ها
- متغیرهایی که روی سرور ایجاد می شوند مثل sessionها
- اطلاعاتی که از پایگاه داده بازیابی می شود
توابع و فیلترها
برای فیلترکردن یک متغیر، یکی از توابع زیر را استفاده کنید:
- ()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 مراجعه کنید.
معتبرسازی و اصولی عمل کردن
به صورت کلی دو نوع فیلتر وجود دارد:
فیلترهای اعتبار سنجی:
- برای معتبر کردن ورودی های کاربر استفاده می شوند.
- برای قالب بندی قوانین محض استفاده می شود.(مثل معتبرسازی URL یا E-Mail)
- اگر داده ورودی، اعتبار نداشته باشد FALSE وگرنه مقدار متغیر را بر می گرداند.
فیلترهای اصولی:
- وجود یا عدم وجود کاراکترهایی خاص در یک رشته را بررسی می کند.
- برای قالب بندی داده ها نیست.
- همیشه یک رشته برمی گرداند.
گزینه ها و پرچم ها (optionها و flagها)
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هایی برای هر فیلتر وجود دارد.
ورودی را معتبر کنید
اجازه دهید با یک مثال ورودی یک فرم را معتبر کنیم.
اولین کاری که باید انجام دهیم این است که مطمئن شویم که داده ای که ما به دنبال آن هستیم وجود دارد یا نه.
سپس داده ی ورودی را با استفاده از تابع ()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" به آن ارسال شده است:
- چک می کند که آیا متغیر ورودی "email" از نوع "GET" موجود هست
- اگر متغیر ورودی وجود داشته باشد٫ چک می کند که آیا یک آدرس ایمیل معتبر هست یا نه
ورودی را اصولی کنید
بیایید پاکسازی یک 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" به آن ارسال شده است:
- چک می کند که آیا متغیر ورودی "url" از نوع "POST" موجود هست.
- اگر متغیر ورودی وجود داشته باشد٫ آن را اصولی (کاراکترهای نامعتبر را کنار می گذارد) و در متغیر url$ ذخیره می کند.
اگر متغیر ورودی یک رشته مثل این باشد "http://www.Beååyamøøooz.com" متغیر url$ بعد از اصولی سازی به این شکل خواهد بود:
http://www.Beyamooz.com
فیلتر ورودی های چندگانه ی
یک فرم 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" به آن ارسال شده است:
- یک آرایه شامل نام متغیرهای ورودی و فیلترهای مصرفی برای متغیرهای ورودی مشخص شده است.
- تابع ()filter_input_array را همراه با متغیرهای ورودی GET و آرایه ای که تعیین کردیم فراخوانی می کنیم.
- متغیرهای "email" و "age" را برای ورودی های نامعتبر در متغیر result$ چک می کند.(اگر هرکدام از متغیرهای ورودی نامعتبر باشند، آن متغیر ورودی پس از تابع ()filter_input_array برابر با FALSE قرار خواهد گرفت)
توجه: پارامتر دوم تابع ()filter_input_array می تواند یک آرایه یا یک صافی خاص باشد. اگر پارامتر یک صافی یا فیلتر خاص باشد تمام مقادیر در آرایه ی ورودی بوسیله ی صافی مشخص شده فیلتر می شوند، اگر پارامتر یک آرایه است باید قواعد زیر را دنبال کند:
- باید یک آرایه ی انجمنی باشد.(PHP Arrays)
- کلید یا ایندکس آرایه باید با نام ورودی ها یکی باشد.
- مقدار آرایه باید یک صافی خاص یا یک آرایه دیگر شامل صافی و flagها و optionها باشد.
صافی های تعریف شده توسط خودمان
امکان فراخوانی یک تابع کاربرنویس و استفاده از آن به عنوان یک فیلتر وجود دارد. با این کار، تمامی فیلترهای ممکن را می توان پوشش داد.
بعد از تعریف تابع خودمان باید با استفاده از 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!
توضیح مثال:
مثال بالا همه ی کاراکترهای "_" را به خط فاصله تبدیل می کند:
- یک تابع برای جایگزین کردن کاراکتر"_" به خط فاصه ایجاد می کند
- تابع ()filter_var را همراه با فیلتر FILTER_CALLBACK و یک آرایه شامل تابع مان فراخوانی می کند
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
- نوشته شده توسط امیر پهلوان صادق
- بازدید: 21231
دیدگاهها
سلام خداقوت.تو مثال فیلتر ورودی چندگانه برای 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);
سلام
بله حق با شماست، در واقع می توان برای 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]
)
سلام خداقوت.در مثال دوم, آیا می توان آرایه اولی را نیاورد؟ چون فقط یک آیتم options داره که خودش شامل آرایست. سوال دوم: من به جای options کلمه option هم که نوشتم خروجی میداد.یعنی فرقی نداره این دو کلمه؟
سلام، لطفا یکبار دیگر به مثال توجه کنید:
$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 هر کلمه دلخواه دیگری را می توانید استفاده کنید.