دوره‌ها / آموزش جامع PHP (از صفر تا استادی) / اعتبارسنجی فرم (PHP Form Validation)

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

30 دقیقه Article

اعتبارسنجیِ فرم: فیلترِ ورودِ داده‌ها 🛡️🔍

اعتبارسنجی (Validation) یعنی اطمینان از اینکه کاربر دقیقاً همان چیزی را وارد کرده که شما انتظار دارید. مثلاً شماره موبایل فقط عدد باشد یا ایمیل فرمتِ درستی داشته باشد.

امنیت در مقابلِ هکِ PHP_SELF

بسیاری از توسعه‌دهندگان از $_SERVER["PHP_SELF"] در action فرم استفاده می‌کنند. این کار خطرناک است! هکرها می‌توانند با اضافه کردنِ کدهایِ جاوااسکریپت به پایانِ URL، حمله‌یِ XSS انجام دهند.

راهکارِ ایمن:

{code_block('// همیشه ورودی را تمیز کنید\n$action = htmlspecialchars($_SERVER["PHP_SELF"]);')}

مراحلِ استانداردِ اعتبارسنجی:

  1. حذفِ فاصله‌هایِ اضافی: با تابعِ trim().
  2. حذفِ بک‌اسلش‌ها: با تابعِ stripslashes().
  3. تبدیلِ تگ‌ها به متن خالص: با تابعِ htmlspecialchars().
یک تابعِ کمکی (Helper): پیشنهاد می‌شود یک تابعِ مرکزی برایِ تمیز کردنِ تمامِ ورودی‌ها بسازید تا مجبور نباشید برایِ هر فیلد ۳ بار کد بنویسید.
تفاوتِ اعتبارسنجی و پاکسازی: اعتبارسنجی (Validation) می‌گوید "آیا داده درست است؟"، اما پاکسازی (Sanitization) می‌گوید "هر چه هست را برایِ من ایمن کن".

تجربه‌یِ کاربری (UX)

اعتبارسنجیِ خوب باید به کاربر بگوید که "کدام" فیلد اشتباه است و چرا. فقط گفتنِ "خطا رخ داد" کافی نیست.

<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: امنیت و مدیریتِ پیشرفته‌یِ فرم‌ها 🐘🛡️

در دنیایِ واقعی، فرم‌ها خطرناک‌ترین بخشِ اپلیکیشنِ شما هستند. هکرها از طریقِ فرم‌ها سعی می‌کنند کدهایِ مخرب تزریق کنند یا داده‌هایِ شما را سرقت کنند.

۱. امنیت در برابر XSS (تزریق کد)

هرگز داده‌یِ کاربر را بدونِ پاکسازی چاپ نکنید. تابعِ htmlspecialchars() کاراکترهایی مثل < و > را به کدهایِ بی‌خطر تبدیل می‌کند تا مرورگر آن‌ها را به عنوانِ تگِ HTML اجرا نکند.

۲. تکنیکِ CSRF Protection

برایِ جلوگیری از این که یک مهاجم از طرفِ کاربرِ شما فرمی را ارسال کند، باید از یک Token امنیتیِ یکبار مصرف در هر فرم استفاده کنید. این توکن در سمتِ سرور چک می‌شود تا تایید شود فرم واقعاً از سایتِ خودتان ارسال شده است.

۳. استفاده از Filter Extension

PHP دارایِ یک افزونه‌یِ داخلیِ قدرتمند برایِ اعتبارسنجی است. به جایِ نوشتنِ رگکس‌هایِ پیچیده برایِ ایمیل، از filter_var($email, FILTER_VALIDATE_EMAIL) استفاده کنید که بسیار دقیق‌تر و ایمن‌تر است.

نکته مهندسی: همیشه از متد POST برایِ ارسالِ داده‌هایِ حساس استفاده کنید. داده‌هایِ GET در تاریخچه‌یِ مرورگر (History) و لاگ‌هایِ سرور باقی می‌مانند که یک ریسکِ امنیتیِ بزرگ است.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

پاکسازی متن Medium
سوال تمرین

یک متغیر به نام $data حاویِ متنِ مخرب "<script>alert(1)</script>" است. با استفاده از htmlspecialchars() آن را به متنِ بی‌خطر تبدیل کنید.

پاسخ تمرین
PHP
<?php
$data = "<script>alert(1)</script>";
echo htmlspecialchars($data);
?>

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.