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

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

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

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

زمانی که فرم سابمیت (ارسال) می شود، داده های وارد شده در فرم با استفاده از متد POST ارسال می شوند.
متغیر $_SERVER["PHP_SELF"] یک متغیر سوپرگلوبال است که نام فایل اسکریپت در حال اجرا را بر می گرداند.
بنابراین متغیر سوپرگلوبال SERVER["PHP_SELF"]_$ داده های ارسال شده از فرم را به خود صفحه بر می گرداند، بجای اینکه به صفحه دیگری برود. بدین طریق، اگر همان صفحه فرم را نمایش دهد، کاربر پیغام خطا دریافت خواهد کرد.
تابع () htmlspecialchars حروف خاص را به کلیت های HTML تبدیل می کند. این بدین معنی است که کارکترهای HTML از قبیل < و > که برای تگ استفاده می شوند را به حروف انسی یا اسکی < و > تبدیل می کند. این کار از سوء استفاده هکرها و مزاحمان از فیلدهای فرم برای حمله و تزریق کد HTML یا جاوا اسکریپت به فرم (حمله اسکریپت کراس سایت) جلوگیری می کند.
یک نکته مهم در مورد امنیت فرم PHP
متغیر SERVER["PHP_SELF"]_$ ممکن است توسط هکرها استفاده شود.
اگر PHP_SELF در صفحه شما استفاده شده باشد، سپس کاربر می تواند یک اسلش (/) را به همراه مقداری فرمان اسکریپت کراس سایت (xss) برای اجرا در فرم وارد کند.
فرض کنید ما فرم زیر را در یک فایل به نام "test_form.php" داریم.

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

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

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

این کد یک تگ اسکریپت و یک فرمان اخطار را اضافه می کند. و زمانی که صفحه بارگذاری می شود، کد جاوا اسکریپت اجرا می شود (کاربر یک دیالوگ پیغام را می بیند). این تنها یک نمونه ساده و بی ضرر سوء استفاده از متغیر PHP_SELF است.
در جریان باشید که هر گونه کد جاوا اسکریپت را می توان بین دو تگ <اسکریپت> قرار داد! یک هکر می تواند کاربر را از فایلی به فایل دیگر بر روی سرور دیگر هدایت (ریدیرکت) کند و آن فایل ممکن است حاوی کد ویروسی و آلوده ای باشد که بتواند متغیرهای گلوبال یا دکمه سابمیت فرم را به آدرس دیگری فرستاده و برای مثال اطلاعات وارد شده کاربر در فرم را در آدرس دیگری ذخیره کند.
چگونه از سوء استفاده دیگران از $_SERVER["PHP_SELF"] جلوگیری کنیم؟
می توان با استفاده از تابع () htmlspecialchars از بهره برداری و سوء استفاده از $_SERVER["PHP_SELF"] پیشگیری کنیم.
کد فرم بایستی شبیه زیر باشد:

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

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

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

حالا نمایش این کد بر روی صفحه یا داخل ایمیل ارسالی از فرم ایمن خواهد بود.
ما همچنین دو کار دیگر در زمان سابمیت داده های فرم توسط کاربر انجام می دهیم:
1- کارکترهای غیر ضروری (مثل space, tab, newline) را از داده های وارد شده توسط کاربر حذف می کنیم (با استفاده از تابع () trim برنامه PHP).
2- حذف بک اسلش (\) از داده های وارد شده توسط کاربر در فرم (با استفاده از تابع () stripslashes برنامه PHP).
گام بعدی ایجاد تابعی است که تمامی بررسی های داده های وارد شده در فرم را برای ما انجام می دهد (که خیلی بهتر از این است که هر بار کد را بنویسیم و تکرار کنیم)
ما نام این تابع را () test_input می گذاریم.
حالا می توانیم هر یک از متغیرهای POST_$ را با استفاده از تابع () test_input چک کنیم. اسکریپت این تابع به شکل زیر خواهد بود:

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