PHP - اعتبارسنجی فرم‌ها (PHP Form Validation)
نوشتن نظر کلیک کنید

PHP – اعتبارسنجی فرم‌ها (PHP Form Validation)

هنگام پردازش فرم‌های پی‌اچ‌پی به امنیت فکر کنید!

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

فرم HTML ساده

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

قوانین اعتبارسنجی برای فرم بالا به شرح زیر است:

  • نام (Name): ضروری. + باید فقط حاوی حروف و فاصله باشد.
  • ایمیل (E-mail): ضروری. + باید شامل یک آدرس ایمیل معتبر (با @ و .) باشد.
  • وب‌سایت (Website): اختیاری. اگر موجود باشد، باید شامل یک URL معتبر باشد.
  • نظر (Comment): اختیاری. فیلد ورودی چند خطی (textarea).
  • جنسیت (Gender): ضروری. باید یکی را انتخاب کنید.

فیلدهای متنی (Text Fields)

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

Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
Website: <input type="text" name="website"><br>
Comment: <textarea name="comment" rows="5" cols="40"></textarea><br>

دکمه‌های رادیویی (Radio Buttons)

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

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

عنصر فرم (The Form Element)

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

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

وقتی فرم ارسال می‌شود، داده‌های فرم با روش post ارسال می‌شوند.

متغیر $_SERVER["PHP_SELF"]

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

تابع htmlspecialchars()

تابع htmlspecialchars() کاراکترهای خاص را به موجودیت‌های HTML تبدیل می‌کند. این بدان معنی است که کاراکترهایی مانند < و > را با &lt; و &gt; جایگزین می‌کند. این کار از سوء استفاده مهاجمان از کد با تزریق HTML یا کد جاوااسکریپت (حملات Cross-site Scripting) در فرم‌ها جلوگیری می‌کند.

اجتناب از سوء استفاده از $_SERVER["PHP_SELF"]

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

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

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

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

تلاش برای سوء استفاده شکست می‌خورد و هیچ آسیبی وارد نمی‌شود!

اعتبارسنجی داده‌های فرم با پی‌اچ‌پی (Validate Form Data With PHP)

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

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

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

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

&lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt;

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

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

  • حذف کاراکترهای غیرضروری (فضای اضافی، تب، خط جدید) از داده‌های ورودی کاربر (با تابع trim() پی‌اچ‌پی).
  • حذف بک‌اسلش‌ها \ از داده‌های ورودی کاربر (با تابع stripslashes() پی‌اچ‌پی).

قدم بعدی ایجاد یک تابع است که تمامی بررسی‌ها را برای ما انجام دهد (که بسیار راحت‌تر از نوشتن همان کد بارها و بارها است). ما نام این تابع را test_input() می‌گذاریم.

اکنون می‌توانیم هر متغیر $_POST را با تابع test_input() بررسی کنیم، و اسکریپت به این صورت خواهد بود:

مثال

// تعریف متغیرها و تنظیم آن‌ها به مقادیر خالی
$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 باشد، سپس فرم ارسال شده است و باید اعتبارسنجی شود. اگر ارسال نشده باشد، اعتبارسنجی را انجام نمی‌دهیم و فرم خالی نمایش داده می‌شود.

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

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

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
Python - محدود کردن داده (MongoDB Limit)

Python – محدود کردن داده (MongoDB Limit)

Python MongoDB محدود کردن نتایج برای محدود کردن نتایج در MongoDB، از متد limit() استفاده می‌کنیم. متد limit() یک...

بیشتر بخوانید
Python - بروزرسانی (MongoDB Update)

Python – بروزرسانی (MongoDB Update)

به‌روزرسانی یک رکورد برای به‌روزرسانی یک رکورد یا سند در MongoDB، از متد update_one() استفاده می‌کنیم. پارامتر اول متد...

بیشتر بخوانید
Python - حذف کالکشن (MongoDB Drop Collection)

Python – حذف کالکشن (MongoDB Drop Collection)

حذف کالکشن شما می‌توانید یک جدول یا کالکشن در MongoDB را با استفاده از متد drop() حذف کنید. مثالحذف...

بیشتر بخوانید

نظرات

سوالات و نظراتتون رو با ما به اشتراک بذارید

برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید.