تأیید فرم PHP

یہ سیکشن اور اگلے سیکشن میں پی ایچ پی کا استعمال سے فرم کی اعداد وشمار کی تصدیق کس طرح کی ہوگی، واضح کرتا ہے。

تأیید فرم PHP

تذکرہ:در پردازش فرم‌های PHP، از امنیت مراقبت کنید!

این صفحات نمایش می‌دهند که چگونه می‌توان به صورت امن فرم‌های PHP را پردازش کرد. تأیید مناسب داده‌های فرم HTML برای جلوگیری از حملات هکرها و ایمیل‌های هرز بسیار مهم است!

فرم‌های HTML که ما در آینده از آن‌ها استفاده می‌کنیم شامل چندین نوع میدان ورودی هستند: فیلدهای متنی ضروری و اختیاری، دکمه‌های رادیویی و دکمه ارسال:

فرم بالا از قوانین تأیید زیر استفاده می‌کند:

فیلد قوانین تأیید
Name ضروری. باید شامل حروف و فضاهای خالی باشد.
E-mail ضروری. باید شامل آدرس الکترونیکی معتبر (که شامل @ و . باشد) باشد.
Website اختیاری. اگر پر شود، باید شامل URL معتبر باشد.
Comment اختیاری. میدان ورودی چند خطی (میدان متنی).
Gender ضروری. باید یک انتخاب کنید.

ابتدا بیایید کد HTML خالص این فرم را بررسی کنیم:

فیلدهای متنی

فیلدهای name، email و website عناصر ورودی متنی هستند، فیلد comment یک میدان متنی است. کد HTML به این صورت است:

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>

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

فیلد gender یک دکمه رادیویی است، کد HTML آن به این صورت است:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

عناصر فرم

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

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

وقتی فرم را ارسال می‌کنید، داده‌های فرم را با استفاده از method="post" ارسال می‌کنید.

متغیر $_SERVER["PHP_SELF"] چیست؟

$_SERVER["PHP_SELF"] یک متغیر کلان محلی است که نام فایل اسکریپت در حال اجرا را برمی‌گرداند.

اساتید،$_SERVER["PHP_SELF"] فرم داده‌ها را به صفحه خود ارسال می‌کند، نه اینکه به صفحه دیگری بپرد. به این ترتیب، کاربر می‌تواند در صفحه فرم خطاها را مشاهده کند.

htmlspecialchars() فنکشن کیا ہے؟

htmlspecialchars() فنکشن خصوصی اشاروں کو HTML رام کی طرح تبدیل کرتی ہے۔ یعنی < اور > جیسے HTML اشاروں کو < اور > میں تبدیل کیا جاتا ہے۔ اس طرح سے حمله وار کو فرم میں HTML یا جاوا اسکریپٹ کو داخل کرنے کی کوشش سے بچایا جاسکتا ہے (کرسٹ سائٹ اسکریپٹنگ حملہ)

PHP فرم سیکورٹی کے بارے میں اہم تذکرہ

$_SERVER["PHP_SELF"] متغیر کو حمله وار کے ذریعے استعمال کیا جاسکتا ہے!

اگر آپ کی صفحہ میں PHP_SELF استعمال کی جائے تو صارف کو کسی بھی خط میں علامت کو داخل کرنے کی اجازت دی جائے اور اس کا استعمال کرسکتا ہے تاکہ کرسٹ سائٹ اسکریپٹنگ (XSS) کو چلایا جائے

تذکرہ:کرسٹ سائٹ اسکریپٹنگ (Cross-site scripting، XSS) ایک کمپیوٹر سیکورٹی خطرہ کا نوعیت ہے جو عمدتاً ویب ایپلی کیشن میں مشہور ہے۔ XSS کا استعمال کرسکتا ہے تاکہ حمله وار کلائنٹ اسکریپٹ کو دوسرے صارف کی ویب پینج پر داخل کرسکتا ہے

مثلاً اگر ایک صفحہ کا نام "test_form.php" ہے تو اس میں مندرجہ ذیل فرم ہے:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

اب اگر صارف کا آدرس بار میں مندرجہ ذیل سادا URL دیکھا جائے:

<form method="post" action="test_form.php">

تا اب تک، یہ تمام چل رہا ہے

لیکن اگر صارف نے آدرس بار میں مندرجہ ذیل URL تلاش کیا:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

اس صورت میں، اُس کد کو مندرجہ ذیل طرح تبدیل کیا جائے گا:

<form method="post" action="test_form.php"/><script>alert('hacked')</script>

یہ کد ایک اسکریپٹ اور ایک نشان دہی کمان شامل کرتا ہے اور جب اس صفحہ کو لوڈ کیا جاتا ہے تو جاوا اسکریپٹ کو چلایا جاتا ہے (صارف کو ایک نشان دہی کا ونڈو دیکھایا جاتا ہے)۔ یہ صرف ایک سادا مثال ہے جس میں PHP_SELF متغیر کا استعمال کیا جاتا ہے اور یہ کچھ سادا مثال ہے جس میں کوئی مضر کارروائی نہیں ہوتی۔

آپ کو معلوم کرنا چاہئے نوکری کے اندرون میں کسی بھی جاوا اسکریپٹ کو شامل کیا جاسکتا ہے! هکرها می‌توانند کاربر را به سرور دیگری و به یک فایل خاص هدایت کنند، که کد بد در آن قرار دارد و می‌تواند متغیرهای جهانی را تغییر دهد یا فرم را به آدرس دیگری ارسال کند تا داده‌های کاربر ذخیره شود و غیره.

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

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

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

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

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

<form method="post" action="test_form.php/"><script>alert('hacked')</script>">

قابل استفاده نیست، بدون خطر!

تأیید داده‌های فرم PHP

اولین کاری که باید انجام دهیم این است که تمام متغیرها را از طریق تابع htmlspecialchars() PHP ارسال کنیم.

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

<script>location.href('http://www.hacked.com')</script>

- کد اجرا نمی‌شود، زیرا به عنوان کد فراری ذخیره می‌شود، مانند این:

<script>location.href('http://www.hacked.com')</script>

حالا این کد در صفحه یا ایمیل امن است.

وقتی کاربر فرم را ارسال می‌کند، ما باید دو کار دیگر انجام دهیم:

  1. (با استفاده از تابع trim() PHP) حذف کردن کاراکترهای غیرضروری از داده‌های ورودی کاربر (فضاهای اضافی، Tab، خطوط جدید)
  2. (با استفاده از تابع stripslashes() PHP) حذف کردن اسلش‌های کاربر از داده‌های ورودی کاربر (\)

در مرحله بعد، ما یک تابع بررسی ایجاد می‌کنیم (این روش بهتر از نوشتن مداوم کد است).

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

حالا، ما می‌توانیم با استفاده از تابع test_input() هر متغیر $_POST را بررسی کنیم، اسکریپت به این شکل است:

مثال

<?php
// دفعیدیاگا بجای خالی تنظیم می‌کنیم
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

مثال اجرا

لطفاً توجه داشته باشید که در ابتدای اسکریپت، ما بررسی کرده‌ایم که آیا فرم با استفاده از $_SERVER["REQUEST_METHOD"] ارسال شده است یا خیر. اگر REQUEST_METHOD POST باشد، فرم ارسال شده است و باید بررسی شود. اگر ارسال نشده باشد، بررسی را بپاس می‌گذاریم و یک فرم خالی نمایش می‌دهیم.

اما در مثال بالا، تمام زمینه‌های ورودی انتخابی هستند. حتی اگر کاربر هیچ داده‌ای وارد نکند، اسکریپت به درستی کار می‌کند.

مرحله بعدی ایجاد زمینه‌های ورودی اجباری و ایجاد پیام‌های خطا مورد نیاز است.