بررسی فرم‌های PHP

این بخش و بخش بعدی توضیح می‌دهد که چگونه از 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 مانند < و > به < و > تبدیل می‌شوند. این کار می‌تواند از حمله‌های XSS جلوگیری کند که توسط تزریق HTML یا JavaScript کد توسط مجرمان انجام می‌شود.

تذکر مهم در مورد امنیت فرم‌های 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 معمولی خط آدرس باشد: "http://www.example.com/test_form.php"، کد بالا به صورت زیر تبدیل خواهد شد:

<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>

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

باید آگاه باشید برچسب <script> قادر به اضافه کردن هرگونه کد JavaScript است! هکرها می‌توانند کاربر را به سرور دیگری هدایت کنند و فایل خاصی را در آن سرور اجرا کنند که کد بدی در آن وجود دارد و می‌تواند متغیرهای جهانی را تغییر دهد یا فرم را به آدرس دیگری ارسال کند تا داده‌های کاربر ذخیره شود و غیره.

چگونه می‌توان از استفاده از $_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 ارسال کنیم.

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

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

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

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

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

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

  1. (با استفاده از تابع trim() PHP) حذف کاراکترهای غیرضروری از داده‌های ورودی کاربر (فضاهای خالی اضافی، تاب‌ها، خطوط جدید).
  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 باشد، فرم ارسال شده است و باید بررسی شود. اگر ارسال نشده باشد، بررسی را رد کرده و یک فرم خالی نمایش داده شود.

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

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