اعتبار سنجیاعتبار سنجیدر مرحله قبل به آموزش روش کنترل کردن تعیین اطلاعات در فیلدهای اجباری فرم پرداختیم تا کاربر آنها را خالی رها نکند . اما در این بخش قصد داریم تا ماهیت اطلاعاتی که کاربر وارد می کند را اعتبار سنجی کرده و ببینیم آیا طبق استاندارهای مورد نظر ما هستند یا خیر . برای مثال در فرم این راهکار ، دو کادر متنی داریم که کاربر در کادر اول بایستی آدرس ایمیل و در کادر دوم آدرس وب سایت خود را وارد نماید . هدف ما طراحی کدهایی است که مقادیر وارد شده در این دو فیلد را بررسی کرده و ببیند آیا با فرمت معمول یک آدرس ایمیل و یک آدرس سایت سازگار هستند یا خیر .
در صورت صحیح بودن داده های ورودی ، فرم امکان ارسال اطلاعات به مقصد را می دهد ، در غیر اینصورت پیام های خطای لازم جهت اصلاح مقادیر ورودی را به کاربر نمایش می دهد .
راهنمایی : اینکه گفتیم می خواهیم بررسی کنیم آیا ایمیل وارد شده دارای فرمت صحیح است ، یعنی اینکه مثلا کاربر ایمیل را به صورت شکل کلی آن یعنی ( abc@doamain.xyz ) , وارد کرده باشد نه هر فرمت غیر متعارف دیگری مثل ( abc@domain ) و یا صرفا اعداد و حروف بی معنی . ولی نمی توانیم تشخیص دهیم ، آیا ایمیل واقعی کاربر است یا خیر .
حتما بخوانید: تابع ( ) opendir در PHP
آشنایی با فرم HTML ثبت اطلاعات و فیلدهای آن :
فرم مثال زیر ، یک فرم ساده HTML را برای دریافت اطلاعات از کاربر نمایش می دهد . این فرم از چندین کنترل Input ، برای وارد نمودن متن، یک دکمه انتخابی و یک دکمه برای ارسال یا Submit فرم به شرح زیر است :
- Name : این فیلد اجباری بوده و برای دریافت نام کاربر استفاده می شود . فقط می تواند شامل حروف و فاصله خالی باشد .
- Email : این فیلد نیز اجباری بوده و برای دریافت ایمیل کاربر به کار می رود . فقط می تواند شامل حروف و اعداد ، به همراه یک کاراکتر @ و باشد .
- Website : این فیلد اختیاری بوده و برای دریافت آدرس سایت کاربر استفاده می شود . اگر پر شود ، بایستی حاوی یک آدرس صحیح اینترنتی باشد .
- Comment : این فیلد نیز اختیاری بوده و فقط می تواند برای دریافت نظر کاربر استفاده شود .
- Gender : انتخاب این گزینه اجباری بوده و کاربر بایستی یکی از دو نوع جنسیت را انتخاب کند .
در ادامه به بررسی کد HTML فرم خواهیم پرداخت .
بررسی کد HTML فرم :
کد کادرهای متن ( Text Fielsd ) :
کادرهای name ، email و وب سایت Website ، کادرهای متن معمولی input بوده و کادر Comment یک کادر متن بزرگ textarea است . کد آنها در فرم به صورت زیر است :
کد | Name: <input type=”text” name=”name”> E-mail: <input type=”text” name=”email”> Website: <input type=”text” name=”website”> Comment: <textarea name=”comment” rows=”5″ cols=”40″></textarea> |
کد کادرهای انتخابی ( Radio Buttons ) :
کادر انتخابی جهت تعیین جنسیت کاربر ( مرد یا زن ) ، یک کنترل رادیویی به صورت زیر است :
کد | Gender: <input type=”radio” name=”gender” value=”female”>Female <input type=”radio” name=”gender” value=”male”>Male |
کد تگ فرم Form Element :
کد تگ فرم که وظیفه ارسال اطلاعات را بر عهده دارد ، به صورت زیر است :
کد | <form method=”post” action=”<?php echo htmlspecialchars($_SERVER[“PHP_SELF”]);?>”> … محتویات … </form> |
هنگامی که فرم ارسال یا submit می شود ، اطلاعات موجود در آن از طریق متد POST ارسال می شوند . در نهایت خروجی فرم به صورت زیر است :
خروجی |
PHP Form ExampleName: * E-mail: * Website: Comment: Gender: Female Male * |
حتما بخوانید: ایجاد و استفاده از کوکی (Cookie) در PHP
بررسی نکات مهم کد فرم :
نکته 1 : متغیر [“SERVER[“PHP_SELF_$ چیست ؟
متغیر [“SERVER[“PHP_SELF_$ ، یک سراسری ( superglobal ) است که نام فایل اجرا کننده کد یا اسکریپت جاری را بر می گرداند .
بنابراین این متغیر ، در هنگام ارسال فرم ، اطلاعات آن را به خود صفحه جاری ( به جای ارسال به صفحه دیگری ) می فرستد . در این حالت ، اطلاعات فرم در همان صفحه پردازش شده و می توان چنانچه اطلاعات دارای اشکال باشند ، در همان صفحه پیام های خطا را به وی نمایش داد.
نکته 2 : تابع ( ) htmlspecialchars چیست ؟
تابع ( ) htmlspecialchars ، کاراکترهای خاص HTML موجود در کادرهای متن فرم را به معادل آنها در زیان HTML تبدیل می کند . برای مثال، اگر کاربر کاراکترهای > و < را در کادرهای متن وارد نماید ، پس از تبدیل به صورت ;lt& یا ;gt& در می آیند . این کار از حملات اسکریپتی در فرم ها جلوگیری می کند .
برای دریافت لیست کامل کاراکترهای خاص HTML به بخش آموزش کاراکترهای خاص HTML بروید .
نکته امنیتی مهم در مورد فرم HTML مورد استفاده :
متغیر [“SERVER[“PHP_SELF_$ ، به راحتی توسط هکرها می تواند مورد استفاده قرار گیرد .
اگر متغیر اشاره گر PHP_SELF که به صفحه جاری اشاره دارد ، در صفحه مورد استفاده قرار بگیرد ، یک هکر می تواند با قرار دادن کاراکتر / و سپس نوشتن کدهای حملات اسکریپتی ( XSS ) ، دستورات خطرناکی را برای اجرا به سرور شما ارسال کند .
برای مثال فرض کنید که همانند مثال فرم این راهکار ، کد فرم به صورت زیر باشد :
کد | <form method=”post” action=”<?php echo $_SERVER[“PHP_SELF”];?>”> |
اگر کاربر یک آدرس معمولی مثل “http://www.example.com/test_form.php” را در نوار ابزار تایپ کرده و اجرا نماید ، کد بالا به صورت زیر ترجمه می شود ، که مشکل یا خطری ندارد :
کد | <form method=”post” action=”test_form.php”> |
اما اگر یک کد حمله اسکریپتی را به صورت زیر وارد نماید :
کد | http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert(‘hacked’)%3C/script%3E |
این کد در هنگام اجرا به صورت زیر ترجمه شده که حاوی یک اسکریپت بوده و پیام هشداری ( alert ( ) ) با محتوای اینکه شما هک شده اید را به کاربر نشان می دهد :
کد | <form method=”post” action=”test_form.php”/><script> alert(‘hacked’)</script> |
توجه داشته باشید که در این گونه موارد ، هر نوع دستور اسکریپتی به راحتی از طریق اشاره گر PHP_SELF ، می تواند به صفحه ارسال شود .
برای مثال هکر می تواند باعث ارجاع ( redirect ) شدن کاربر به صفحه دیگری که حاوی اسکریپت مورد نظرش است شده یا حتی اطلاعات فرم را بدزدد .
نحوه پیشگیری از حملات اسکریپتی :
حملات اسکریپتی از طریق اشاره گر PHP_SELF یا سایر توابع و متغیرهای صفحه ، همانطور که در بخش قبل اشاره کردیم ، با استفاده از تابع ( ) htmlspecialchars قابل پیشگیری است .
در واقع کد فرم مثال قبل را بایستی با تابع ( ) htmlspecialchars به صورت زیر بازنویسی کنیم :
کد | <form method=”post” action=”test_form.php”/><script> alert(‘hacked’)</script> |
تابع ( ) htmlspecialchars ، کاراکترهای خاص در HTML را به معادل حروفی آن تبدیل کرده و باعث می شود تا مثلا مد حمله اسکریپتی مثال قبل به صورت زیر ترجمه و ارسال شود که به دلیل تغییر ماهیت ، اجرا نشده و
آسیبی نمی تواند به سیستم وارد نماید :
کد | <form method=”post” action=”test_form.php”/><script> alert(‘hacked’)</script> |
حتما بخوانید: تابع ( ) closedir در PHP
بررسی نحوه اعتبار سنجی مقادیر ورودی در فیلدهای متنی PHP
در راهکارهای قبل ، نحوه کلی اعتبار سنجی و کنترل وارد نمودن مقادیر در فیلدهای یک فرم را بررسی کردیم .
در این بخش به صورت جزیی تر و موردی به نحوه اعتبار سنجی مقادیر وارد شده برای فیلم های Name , Email و URL خواهیم پرداخت .
نحوه اعتبار سنجی کادر Name :
فرض کنید که در یک کادر متن، می خواهیم کاربر فقط بتواند حروف و یا فاصله خالی وارد کرده و وارد نمودن اعداد و سایر کاراکترها مجاز نباشد .
کد زیر یک راه ساده برای کنترل این مسئله را در اختیارمان قرار می دهد. در ابتدا مقدار ارسال شده از فرم توسط متغیر [“POST[“name_$ دریافت شده و در متغیر name$ ریخته می شود .
سپس توسط تابع ( ) Preg_match ، الگوی تعیین شده در تابع مقدار کنترل را سنجیده و چنانچه فقط شامل حروف و یا فاصله خالی باشد ، مقدار true را بر می گرداند . در غیر اینصورت مقدار آن false است .
با false بودن مقدار تابع ( ) Preg_match ، دستور شرطی if کد اجرا شده و یک پیام خطا ، مبنی بر غیر مجاز بودن استفاده از سایر کاراکترها را برای نمایش ثانویه در متغیر nameErr$ دخیره می کند . به کد زیر دفت نمایید :
کد | $name = test_input($_POST[“name”]); if (!preg_match(“/^[a-zA-Z ]*$/”,$name)) { $nameErr = “فقط حروف و فاصله خالی مچاز است “; } |
نکته مهم : تابع ( ) Preg_match ، تابعی است که یک مقدار وارد شده را با الگو یا معیار تعیین شده برای آن مقایسه کرده و مقدار true یا false را بر می گرداند .
نحوه اعتبار سنجی فیلد ایمیل Email
فرض کنید در یک کادر متن ، کاربر بایستی ایمیل خود را وارد کند . به وسیله کد زیر می توانید تشخیص دهید آیا مقداری که کاربر در کادر ایمیل وارد کرده ، دارای ساختار صحیح یک ایمیل است یا خیر . در غیر اینصورت پیام اخطاری را به وی نشان دهید .
کد | $email = test_input($_POST[“email”]); if (!preg_match(“/([\w\-]+\@[\w\-]+\.[\w\-]+)/”,$email)) { $emailErr = “آدرس ایمیل نا معتبر است”; } |
نحوه اعتبار سنجی مقدار ورودی در کادر URL :
در مثال زیر نیز کدی را طراحی کرده ایم که همانند مثال های قبل ، از طریق تابع ( ) Preg_match ، مقدار وارد شده در کادر website را بررسی کرده و چنانچه مطابق الگوی صحیح یک آدرس اینترنتی باشد ، آن را قبول کرده و در غیر اینصورت یک پیام خطا را جهت نمایش ثانویه به کاربر در متغیر $websiteErr ذخیره کند .
کد | $website = test_input($_POST[“website”]); if (!preg_match(“/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i”,$website)) { $websiteErr = “آدرس اینترنتی نا معتبر است”; } |
نمایش کامل مثال و مشاهده خروجی صفحه :
پس از اینکه به صورت تک به تک با نحوه اعتبار سنجی فیلدهای فرم آشنا شدید ، حال کد کامل مثال را نشان داده و می توانید خروجی آن را در عمل مشاهده نمایید :
کد | <?php // تعیین متغیرهای لازم و قرار دادن آنها بر روی مقدار اولیه خالی $nameErr = $emailErr = $genderErr = $websiteErr = “”; $name = $email = $gender = $comment = $website = “”; |
if ($_SERVER[“REQUEST_METHOD”] == “POST”)
{
if (empty($_POST[“name”]))
{$nameErr = “وارد نمودن نام اجباری است”;}
else
{
$name = test_input($_POST[“name”]);
// چک کردن اینکه آیا نام وارد شده فقط شامل حروف و فاصله خالی است
if (!preg_match(“/^[a-zA-Z ]*$/”,$name))
{
$nameErr = ” فقط حروق و فاصله خالی مجاز است “;
}
}
if (empty($_POST[“email”]))
{$emailErr = “وارد نمودن ایمیل اجباری است”;}
else
{
$email = test_input($_POST[“email”]);
// چک کردن اینکه آیا ایمیل وارد شده معتبر است
if (!preg_match(“/([\w\-]+\@[\w\-]+\.[\w\-]+)/”,$email))
{
$emailErr = ” ایمیل وارد شده نا معتبر است”;
}
}
if (empty($_POST[“website”]))
{$website = “”;}
else
{
$website = test_input($_POST[“website”]);
// چک کردن اینکه آیا آدرس اینترنتی وارد شده دارای ساختار صحیح است
if (!preg_match(“/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i”,$website))
{
$websiteErr = “آدرس اینترنتی وارد شده نا معتبر است”;
}
}
if (empty($_POST[“comment”]))
{$comment = “”;}
else
{$comment = test_input($_POST[“comment”]);}
if (empty($_POST[“gender”]))
{$genderErr = “تعیین جنسیت اجباری است”;}
else
{$gender = test_input($_POST[“gender”]);}
}
?>
با دریافت « مشاوره برنامهنویسی، وب و سئو » از کارشناسان جوان حرفهای و باتجربه ساکوراد؛ موفقیت کسب و کار، رونق فروش و افزایش درآمد خود را تضمین کنید!
و اما کلام آخر…
با پیروی از این مراحل، میتوانید اطلاعات ورودی کاربران را به طور مؤثر در فرمهای PHP اعتبار سنجی کنید.