اعتبار سنجی فرم ها در PHP
در این بخش نحوه اعتبار سنجی فرم ها در PHP را بررسی می کنیم. ما برای حفظ امنیت وب سایت باید داده های ارسالی از سمت کاربر را اعتبار سنجی کنیم در غیر این صورت دچار مشکلات امنیتی خواهیم شد.
در این بخش قوانینی که برای فیلد های ورودی قرار است مشخص کنیم را در جدول زیر تعیین کرده ایم:
فیلد | قوانین اعتبار سنجی |
---|---|
Name | تکمیل آن اجباری است و باید با حروف و فضای خالی تکمیل بشود. |
تکمیل آن اجباری است و باید دارای یک آدرس ایمیل معتبر با @ و . باشد. | |
Website | تکمیل آن اختیاری است و باید دارای یک آدرس URL معتبر باشد. |
Comment | تکمیل آن اختیاری است و یک نوع فیلد ورودی چند خطی می باشد. |
Gender | تکمیل آن اجباری است و باید انتخاب شود. |
ابتدا باید کد های HTML مربوط به فیلد ها و فرم را طراحی کنیم.
فهرست مطالب:
فیلد های متنی
فیلد های نام و وب سایت با عنصر input و از نوع text مشخص می شود و فیلد ایمیل از نوع email و فیلد کامنت تگ textarea می باشد.
کد HTML آن به شکل زیر است:
دکمه های رادیویی
فیلد های مربوط به جنسیت با تگ input و از نوع radio می باشند همانند این:
تگ form
کد HTML مربوط به تگ form به این شکل می باشد:
با توجه به اینکه مقدار method برابر با post می باشد، داده ها به روش POST سمت سرور ارسال خواهند شد.
متغیر$_SERVER["PHP_SELF"]
یک متغیر سراسری می باشد که نام فایل اسکریپت در حال اجرا را برمی گرداند.
با این کاری که انجام دادیم مقادیر فیلد های فرم، سمت اسکریپت فعلی ارسال خواهد شد، بنابر این کاربر پیغام های مربوطه را در همان صفحه ای که هست دریافت می کند.
تابع htmlspecialchars()
کاراکتر های خاص را به موجودیت های HTML تبدیل می کند. این بدان معناست که کاراکتر های HTML مانند <
و >
را با <
و >
ذخیره و نمایش می دهد.
از این کار برای جلوگیری از حملات XSS تزریق کد HTML, CSS, JavaScript استفاده می کنیم.
نکات امنیتی مهم در فرم PHP
متغیر $_SERVER["PHP_SELF"]
می تواند توسط هکرها استفاده شود.
اگر از PHP_SELF در صفحه استفاده کنید، کاربر می تواند یک اسلش (/) و سپس چند دستور Cross Site Scripting (XSS) را برای اجرا وارد کند.
در رابطه با جزئیات بیشتر حملات XSS تحقیق کنید، این نوع حملات امکان تزریق کد به صفحه را می دهد و می توان از آن برای فیشینگ کاربر های یک وب سایت استفاده کرد.
فرض کنید فرم زیر را در صفحه ای به نام test_form.php
داریم:
اکنون، اگر کاربر URL معمولی را در نوار آدرس مانند “http://www.example.com/test_form.php” وارد کند، کد بالا به صورت زیر ترجمه می شود:
حال اگر کاربر آدرس را به شکل زیر وارد کند:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
در این صورت کد بالا به صورت زیر ترجمه می شود:
این کد یک تگ اسکریپت و یک فرمان هشدار اضافه می کند. و هنگامی که صفحه بارگذاری می شود، کد جاوا اسکریپت اجرا می شود (کاربر یک جعبه هشدار را مشاهده می کند). این فقط یک مثال ساده و بی ضرر است که چگونه می توان از متغیر PHP_SELF سوء استفاده کرد.
توجه داشته باشید که هر کد جاوا اسکریپت را می توان در تگ <script>
اضافه کرد! یک هکر میتواند کاربر را به فایلی در سرور دیگری هدایت کند، و آن فایل میتواند کد مخربی را در خود نگه دارد که میتواند متغیرهای سراسری را تغییر دهد یا فرم را به آدرس دیگری ارسال کند تا دادههای کاربر را ذخیره کند.
چگونه از سوء استفاده های $_SERVER["PHP_SELF"]
جلوگیری کنیم؟
با استفاده از تابع htmlspecialchars()
می توان از سوء استفاده های $_SERVER["PHP_SELF"]
جلوگیری کرد.
کد تگ form باید به شکل زیر باشد:
تابع htmlspecialchars()
کاراکتر های خاص را به موجودیت های HTML تبدیل می کند. حال اگر کاربر سعی کند از متغیر PHP_SELF سوء استفاده کند، خروجی زیر را به همراه خواهد داشت:
تلاش هکر برای تزریق کدها با شکست مواجه می شود و امکان سوء استفاده دیگر وجود نخواهد داشت.
اعتبارسنجی داده های فرم با PHP
اولین کاری که باید انجام بدهیم این هست که تمام ورودی ها را با تابع htmlspecialchars()
پاکسازی و فیلتر کنیم.
سپس با تابع trim()
فضا های خالی و اضافی رشته ها را حذف می کنیم.
همچنین با تابع stripslashes()
مقدار بک اسلش (\) را از داده های ورودی کاربر حذف می کنیم.
در آخر برای بهبود کیفیت کد ها و راحتی انجام این عملیات ها یک تابع تعریف می کنیم که همه این عملیات ها را برای ما انجام بدهد.
نام تابع را test_input()
می گذاریم.
اکنون میتوانیم هر متغیر $_POST
را با تابع test_input()
بررسی کنیم.
مثال
دقت داشته باشید که ابتدا با متغیر $_SERVER["REQUEST_METHOD"]
بررسی می کنیم آیا فرم با متد post ارسال شده است یا خیر.
اگر فرم ارسال شده باشد آن را اعتبار سنجی می کنیم در غیر این صورت از اعتبار سنجی صرف نظر می کنیم.
با این حال در مثال بالا تمام فیلد های ورودی اختیاری هستند. حتی اگر کاربر هیچ داده ای را وارد نکند اسکریپت به خوبی کار می کند.
گام بعدی این هست که تکمیل فیلد ها را اجباری کنید و در صورت نیاز پیغام خطایی را به کاربر نمایش دهید. لطفاً مقاله ورودی های اجباری فرم در PHP را مطالعه کنید.
آیا این مطلب برای شما مفید بود ؟