فیلتر ورودی ها در 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" به آن ارسال شده است:
- چک می کند که آیا متغیر ورودی "email" از نوع "GET" موجود هست
- اگر متغیر ورودی وجود داشته باشد٫ چک می کند که آیا یک آدرس ایمیل معتبر هست یا نه
ورودی را اصولی کنید
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" به آن ارسال شده است:
- چک می کند که آیا متغیر ورودی "url" از نوع "POST" موجود هست.
- اگر متغیر ورودی وجود داشته باشد٫ آن را اصولی (کاراکترهای نامعتبر را کنار می گذارد) و در متغیر 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" به آن ارسال شده است:
- یک آرایه شامل نام متغیرهای ورودی و فیلترهای مصرفی برای متغیرهای ورودی مشخص شده است.
- تابع ()filter_input_array را همراه با متغیرهای ورودی GET و آرایه ای که تعیین کردیم فراخوانی می کنیم.
- متغیرهای "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!
توضیح مثال:
مثال بالا همه ی کاراکترهای "_" را به خط فاصله تبدیل می کند:
- یک تابع برای جایگزین کردن کاراکتر"_" به خط فاصه ایجاد می کند
- تابع ()filter_var را همراه با فیلتر FILTER_CALLBACK و یک آرایه شامل تابع مان فراخوانی می کند
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHPکلیک کنید.
READ MORE