آموزش PHP > راهکارهای موثر در PHP > راهکار های کار با فرم ها در
PHP
بخش سوم : اعتبار سنجی اطلاعات ورودی کاربران در فرم های وب PHP
مقدمه :
در مرحله قبل به آموزش روش کنترل کردن تعیین اطلاعات در فیلدهای اجباری فرم پرداختیم
تا کاربر آنها را خالی رها نکند .
اما در این بخش قصد داریم تا ماهیت اطلاعاتی که کاربر وارد می کند را اعتبار سنجی کرده
و ببینیم آیا طبق استاندارهای مورد نظر ما هستند یا خیر .
برای مثال در فرم این راهکار ، دو کادر متنی داریم که کاربر در کادر اول بایستی آدرس
ایمیل و در کادر دوم آدرس وب سایت خود را وارد نماید . هدف ما طراحی کدهایی است که
مقادیر وارد شده در این دو فیلد را بررسی کرده و ببیند آیا با فرمت معمول یک آدرس ایمیل
و یک آدرس سایت سازگار هستند یا خیر .
در صورت صحیح بودن داده های ورودی ، فرم امکان ارسال اطلاعات به مقصد را می دهد ، در
غیر اینصورت پیام های خطای لازم جهت اصلاح مقادیر ورودی را به کاربر نمایش می دهد .
راهنمایی : اینکه گفتیم می خواهیم بررسی کنیم آیا ایمیل وارد شده
دارای فرمت صحیح است ، یعنی اینکه مثلا کاربر ایمیل را به صورت شکل کلی آن یعنی ( abc@doamain.xyz
) , وارد کرده باشد نه هر فرمت غیر متعارف دیگری مثل ( abc@domain ) و یا صرفا اعداد
و حروف بی معنی . ولی نمی توانیم تشخیص دهیم ، آیا ایمیل واقعی کاربر است یا خیر .
آشنایی با فرم 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 ارسال می شوند . در نهایت خروجی فرم به صورت
زیر است :
بررسی نکات مهم کد فرم :
نکته 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 :
راجع این مطلب
سوال یا اشکالی دارید ؟! آن را در انجمن سایت مطرح نمایید ...
>>>>> ورود به انجمن تخصصی
نطر خودتان درباره این صفحه :