ارزیابی اعتبار فرم در PHP

در این مقاله و مقاله بعدی طریقه استفاده از اسکریپت PHP برای ارزیابی اعتبار داده های فرم را بحث می کنیم.

تعیین اعتبار داده های فرم PHP

زمان تعیین اعتبار فرم های PHP بایستی به فکر امنیت سایت و داده های خود بود! در این مقاله به طریقه رسیدگی به فرم های PHP و داده های وارد شده توسط کاربر و پردازش اطلاعات فرم می پردازیم در حالی که همزمان مسائل امنیتی را هم لحاظ می کنیم. اعتباربخشی صحیح داده های فرم برای محافظت فرم و سایت خود از دست هکرها و ویروس ها و اسپامرها اهمیت دارد.

در این مقاله یک فرم HTML ایجاد می کنیم که از فیلدهای مختلفی تشکیل شده است، فیلدهای الزامی و اختیاری، فیلدهای متنی، دکمه های رادیویی، دکمه سابمیت و غیره. خروجی این فرم در تصویر زیر آمده است:

 تعیین اعتبار داده های فرم PHP

قواعد تعیین اعتبار این فرم به صورت زیر است:

فیلد قاعده اعتباربخشی
نام الزامی + فقط حاوی حروف و فاصله باشد
ایمیل الزامی + بایستی آدرس ایمیل معتبر حاوی @ و . باشد
وبسایت اختیاری، اگر تکمیل شد، حاوی یک URL صحیح باشد
نظر اختیاری، فیلد متنی چند خطی (محدوده متنی)
جنس الرامی. بایستی یکی از دو مورد انتخاب شود.

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

فیلدهای متنی

فیلدهای نام، ایمیل و وبسایت همگی ورودی متنی دارند و فیلد متنی هستند؛ فیلد نظر به صورت متن چند خطی است. کد این فیلدها به صورت زیر خواهد بود:

 تعیین اعتبار داده های فرم PHP

دکمه های رادیویی

فیلد جنسیت به صورت دکمه رادیویی ایجاد می شود و کد HTML آن به صورت زیر است:

 تعیین اعتبار داده های فرم PHP

اجزای فرم

کد HTML فرم به صورت زیر است:

 تعیین اعتبار داده های فرم PHP

زمانی که فرم سابمیت (ارسال) می شود، داده های وارد شده در فرم با استفاده از متد POST ارسال می شوند.

آیا می دانید متغیر SERVER["PHP_SELF"]_$ چیست؟
متغیر $_SERVER["PHP_SELF"] یک متغیر سوپرگلوبال است که نام فایل اسکریپت در حال اجرا را بر می گرداند.

بنابراین متغیر سوپرگلوبال SERVER["PHP_SELF"]_$ داده های ارسال شده از فرم را به خود صفحه بر می گرداند، بجای اینکه به صفحه دیگری برود. بدین طریق، اگر همان صفحه فرم را نمایش دهد، کاربر پیغام خطا دریافت خواهد کرد.

تابع () htmlspecialchars چیست؟
تابع () htmlspecialchars حروف خاص را به کلیت های HTML تبدیل می کند. این بدین معنی است که کارکترهای HTML از قبیل < و > که برای تگ استفاده می شوند را به حروف انسی یا اسکی < و > تبدیل می کند. این کار از سوء استفاده هکرها و مزاحمان از فیلدهای فرم برای حمله و تزریق کد HTML یا جاوا اسکریپت به فرم (حمله اسکریپت کراس سایت) جلوگیری می کند.

یک نکته مهم در مورد امنیت فرم PHP

متغیر SERVER["PHP_SELF"]_$ ممکن است توسط هکرها استفاده شود.

اگر PHP_SELF در صفحه شما استفاده شده باشد، سپس کاربر می تواند یک اسلش (/) را به همراه مقداری فرمان اسکریپت کراس سایت (xss) برای اجرا در فرم وارد کند.

کراس سایت اسکریپتینگ (xss) نوعی آسیب پذیری امنیتی کامپیوتری است که در برنامه های وب (وب اپلیکیشن) یافت می شود. XSS به هکرها این امکان را می دهد که اسکریپت سمت مددجوی خود را به داخل صفحات وبی که توسط کاربران دیگر مشاهده می شود، تزریق کنند.

فرض کنید ما فرم زیر را در یک فایل به نام "test_form.php" داریم.

 تعیین اعتبار داده های فرم PHP

حالا، اگر کاربر یک URL نرمال را در آدرس بار مرورگر وارد کند، مثل "http://www.example.com/test_form.php" ، کد فوق به کد زیر ترجمه می شود:

 تعیین اعتبار داده های فرم PHP

تا اینجا خوب است.

هرچند، فرض کنید که کاربری متن زیر را در آدرس بار مرورگر وارد کند:

 تعیین اعتبار داده های فرم PHP

در این حالت، کد فوق به صورت زیر ترجمه می شود:

 تعیین اعتبار داده های فرم PHP

این کد یک تگ اسکریپت و یک فرمان اخطار را اضافه می کند. و زمانی که صفحه بارگذاری می شود، کد جاوا اسکریپت اجرا می شود (کاربر یک دیالوگ پیغام را می بیند). این تنها یک نمونه ساده و بی ضرر سوء استفاده از متغیر PHP_SELF است.

در جریان باشید که هر گونه کد جاوا اسکریپت را می توان بین دو تگ <اسکریپت> قرار داد! یک هکر می تواند کاربر را از فایلی به فایل دیگر بر روی سرور دیگر هدایت (ریدیرکت) کند و آن فایل ممکن است حاوی کد ویروسی و آلوده ای باشد که بتواند متغیرهای گلوبال یا دکمه سابمیت فرم را به آدرس دیگری فرستاده و برای مثال اطلاعات وارد شده کاربر در فرم را در آدرس دیگری ذخیره کند.

چگونه از سوء استفاده دیگران از $_SERVER["PHP_SELF"] جلوگیری کنیم؟

می توان با استفاده از تابع () htmlspecialchars از بهره برداری و سوء استفاده از $_SERVER["PHP_SELF"] پیشگیری کنیم.

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

 تعیین اعتبار داده های فرم PHP

با استفاده از تابع () htmlspecialchars کارکترهای ویژه به کلیت های HTML تبدیل می شوند. حالا اگر کاربری سعی کند که از متغیر PHP_SELF سوء استفاده کند، نتیجه کد وارد شده در آدرس بار به صورت زیر خواهد شد:

 تعیین اعتبار داده های فرم PHP

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

اعتباربخشی داده های فرم با HTML

اولین کاری که باید در ارزیابی اعتبار داده های یک فرم HTML انجام داد، این است که تمامی متغیرهای حاوی داده فرم را از تابع () htmlspecialchars گذراند.

زمانی که از تابع () htmlspecialchars استفاده می شود، اگر کاربر سعی کند فرمان زیر را از طریق یک فیلد متنی ارسال کند:

 تعیین اعتبار داده های فرم PHP

این کد اجرا نخواهد شد، زیرا به صورت نسخه تبدیل شده HTML ذخیره می شود، مثل فرمان زیر:

 تعیین اعتبار داده های فرم PHP

حالا نمایش این کد بر روی صفحه یا داخل ایمیل ارسالی از فرم ایمن خواهد بود.

ما همچنین دو کار دیگر در زمان سابمیت داده های فرم توسط کاربر انجام می دهیم:

1- کارکترهای غیر ضروری (مثل space, tab, newline) را از داده های وارد شده توسط کاربر حذف می کنیم (با استفاده از تابع () trim برنامه PHP).

2- حذف بک اسلش (\) از داده های وارد شده توسط کاربر در فرم (با استفاده از تابع () stripslashes برنامه PHP).

گام بعدی ایجاد تابعی است که تمامی بررسی های داده های وارد شده در فرم را برای ما انجام می دهد (که خیلی بهتر از این است که هر بار کد را بنویسیم و تکرار کنیم)

ما نام این تابع را () test_input می گذاریم.

حالا می توانیم هر یک از متغیرهای POST_$ را با استفاده از تابع () test_input چک کنیم. اسکریپت این تابع به شکل زیر خواهد بود:

 تعیین اعتبار داده های فرم PHP

به شروع اسکریپت توجه کنید، ما ابتدا با استفاده از متد SERVER["REQUEST_METHOD"]_$ چک می کنیم که آیا فرم سابمیت شده است یا خیر. اگر REQUEST_METHOD به صورت POST باشد، فرم سابمیت شده است یعنی کاربر فرم را تکمیل کرده و دکمه ارسال را زده است و حالا بایستی تعیین اعتبار شود. اگر هنوز فرم سابمیت نشده باشد، این متد یک فرم خالی را نمایش خواهد داد.

در مقاله بعدی فیلدهای فرم را به الزامی تبدیل کرده و در صورت نیاز پیام خطا برای فیلدهای می نویسیم.