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

گروه کسب و کار ساکوراد
فهرست
آموزش زبان PHP

آموزش زبان PHP | اعتبار سنجی اطلاعات ورودی کاربران در فرم های وب PHP

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

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

اعضای شبکه مشاوران در حوزه «برنامه‌نویسی، وب و امنیت سایبری»

مشاور شبکه، نرم افزار و هوش مصنوعی

اگر به دنبال رفع چالشهای شبکه، نرم‌افزار و امنیت فضای...

مشاور مسیریابی شغلی، کارآفرینی و استارتاپ

اگر به دنبال موفقیت در کارآفرینی و یا داشتن کسب...

مشاور تحقیقات بازار، بازاریابی و فروش

اگر علاقمندید در تراز شرکتهای بزرگ و صاحب‌نام، بخش بازاریابی...

مشاور مدیریت، برنامه‌ریزی و سئو | مترجم انگلیسی

اگر به دنبال بکارگیری آخرین متدهای جهانی مدیریت منابع انسانی...

راهنمایی : اینکه گفتیم می خواهیم بررسی کنیم آیا ایمیل وارد شده دارای فرمت صحیح است ، یعنی اینکه مثلا کاربر ایمیل را به صورت شکل کلی آن یعنی ( abc@doamain.xyz ) , وارد کرده باشد نه هر فرمت غیر متعارف دیگری مثل ( abc@domain ) و یا صرفا اعداد و حروف بی معنی . ولی نمی توانیم تشخیص دهیم ، آیا ایمیل واقعی کاربر است یا خیر .

آشنایی با فرم HTML ثبت اطلاعات و فیلدهای آن :

فرم مثال زیر ، یک فرم ساده HTML را برای دریافت اطلاعات از کاربر نمایش می دهد . این فرم از چندین کنترل Input ، برای وارد نمودن متن، یک دکمه انتخابی و یک دکمه برای ارسال یا Submit فرم به شرح زیر است :

  • Name : این فیلد اجباری بوده و برای دریافت نام کاربر استفاده می شود . فقط می تواند شامل حروف و فاصله خالی باشد .
  • Email : این فیلد نیز اجباری بوده و برای دریافت ایمیل کاربر به کار می رود . فقط می تواند شامل حروف و اعداد ، به همراه یک کاراکتر @ و باشد .
  • Website : این فیلد اختیاری بوده و برای دریافت آدرس سایت کاربر استفاده می شود . اگر پر شود ، بایستی حاوی یک آدرس صحیح اینترنتی باشد .
  • Comment : این فیلد نیز اختیاری بوده و فقط می تواند برای دریافت نظر کاربر استفاده شود .
  • Gender : انتخاب این گزینه اجباری بوده و کاربر بایستی یکی از دو نوع جنسیت را انتخاب کند .

cropped-favicon.webp حتما بخوانید : نمایش و نگهداری مقادیر وارد شده در فیلدهای یک فرم PHP

 

در ادامه به بررسی کد 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 Example

Name: *

E-mail: *

Website:

Comment:

Gender: Female Male *

بررسی نکات مهم کد فرم :

نکته 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>

بررسی نحوه اعتبار سنجی مقادیر ورودی در فیلدهای متنی 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”]);}
}
?>

https://succourad.com/?p=10088
پیشنهاد براساس سلیقه شما

سئوالات و نظرات ارزشمند خود را با ما مطرح کنید

دیدگاهتان را بنویسید