سطح B: ارسال امن داده (متد POST)

در سطح A دیدیم که متد GET داده‌ها را به URL اضافه می‌کند. این کار برای اطلاعات غیرحساس ساده و کاربردی است، اما یک مشکل امنیتی بزرگ دارد. در این سطح، با متد POST آشنا می‌شویم که روش استاندارد برای ارسال اطلاعات حساس (مانند فرم‌های ورود و ثبت‌نام) است.

محتوای آموزشی

۱. مشکل GET چیست؟

تصور کنید یک فرم ورود ساخته‌اید. اگر از method="GET" استفاده کنید، URL نهایی چیزی شبیه به این خواهد بود:

login.php?username=my_user&password=MySecret123

این یک فاجعه امنیتی است! چرا؟

۲. راه‌حل: متد POST

وقتی در فرم از method="POST" استفاده می‌کنید، مرورگر داده‌ها را در URL قرار نمی‌دهد. به جای آن، داده‌ها را در «بدنه» (Body) درخواست HTTP بسته‌بندی کرده و به صورت مخفیانه به سرور ارسال می‌کند.

۳. دریافت داده با $_POST

همانند $_GET، شرکت PHP یک سوپرگلوبال دیگر به نام $_POST برای ما فراهم کرده است. وقتی فرمی با POST ارسال می‌شود، تمام داده‌ها به طور خودکار در این آرایه قرار می‌گیرند و ما می‌توانیم با استفاده از «کلید» (همان name در input) به آن‌ها دسترسی پیدا کنیم.

۴. مقایسه GET و POST

ویژگی متد GET متد POST
نمایش داده در URL (Query String) در بدنه HTTP (مخفی)
امنیت ناامن برای داده‌های حساس امن‌تر (استاندارد برای فرم‌ها)
محدودیت حجم دارد (حدود ۲۰۰۰ کاراکتر) ندارد (یا بسیار زیاد است)
قابلیت بوکمارک دارد (چون داده در URL است) ندارد (ارسال مجدد نیاز به تایید دارد)
کاربرد رایج جستجو، شماره صفحات، فیلترها فرم ورود، ثبت‌نام، ارسال فایل

کارگاه عملی: ماشین حساب ساده

دوباره دو فایل می‌سازیم. این بار یک ماشین حساب ساده که دو عدد را با متد POST می‌گیرد و جمع می‌کند.

فایل calc.html (فرم):

<!DOCTYPE html>
<html lang="fa" dir="rtl">
<body>
    <h4>ماشین حساب جمع</h4>
    <form action="do_calc.php" method="POST">
        <label for="n1">عدد اول:</label>
        <input type="number" id="n1" name="num1">
        
        <label for="n2">عدد دوم:</label>
        <input type="number" id="n2" name="num2">
        
        <input type="submit" value="جمع کن">
    </form>
</body>
</html>

فایل do_calc.php (پردازشگر):

<?php
// داده‌ها را از $_POST می‌خوانیم
$number1 = $_POST['num1'];
$number2 = $_POST['num2'];

// نکته: داده‌های فرم همیشه «رشته» (string) هستند.
// برای محاسبات ریاضی، بهتر است آن‌ها را به عدد تبدیل کنیم.
$sum = (int)$number1 + (int)$number2;

echo "نتیجه جمع " . $number1 . " و " . $number2 . " برابر است با:";
echo "<h1>" . $sum . "</h1>";
?>

خروجی و تحلیل:

وقتی در فرم اعداد ۱۰ و ۵ را وارد کرده و «جمع کن» را بزنید، به صفحه do_calc.php هدایت می‌شوید. این بار به نوار آدرس مرورگر خود دقت کنید:

https://your-site.com/do_calc.php

می‌بینید؟ URL کاملاً تمیز است! هیچ اثری از اعداد ۱۰ و ۵ در آن نیست. داده‌ها به صورت امن ارسال شده‌اند.

خروجی صفحه نیز این خواهد بود:


تمرین شما

صورت تمرین: شبیه‌ساز ورود

یک فرم (login.html) با دو فیلد بسازید:

  1. «نام کاربری» با name="username"
  2. «رمز عبور» با name="password" (از <input type="password"> استفاده کنید تا حروف به صورت ستاره‌ای نمایش داده شوند)

داده‌ها را با متد POST به فایل check_login.php ارسال کنید. در فایل check_login.php، باید از دستورات شرطی (گام ۳) استفاده کنید:

  • دو متغیر برای نام کاربری و رمز عبور دریافت شده از $_POST بسازید.
  • چک کنید (if) که آیا نام کاربری «دقیقاً» برابر با "admin" و (عملگر &&) رمز عبور «دقیقاً» برابر با "CorePro1403" است یا خیر.
  • اگر هر دو درست بودند، پیام "خوش آمدید، مدیر!" را با رنگ سبز چاپ کنید.
  • در غیر این صورت (else)، پیام "نام کاربری یا رمز عبور اشتباه است!" را با رنگ قرمز چاپ کنید.

(راهنمایی: برای رنگی کردن متن می‌توانید از تگ <span style="color: red;">...</span> استفاده کنید.)

باشگاه ذهن: ارسال فایل چطور؟

چالش شما: ما یاد گرفتیم که POST برای ارسال داده‌های متنی مخفی استفاده می‌شود. اما اگر بخواهیم یک فایل (مثل عکس پروفایل، فایل PDF یا فایل Zip) ارسال کنیم چه؟ آیا POST به تنهایی کافی است؟

پاسخ «خیر» است. ارسال فایل به دو چیز اضافه نیاز دارد: یک ویژگی خاص در تگ <form> و یک سوپرگلوبال کاملاً متفاوت در PHP.

وظیFه: یک پرامپت برای هوش مصنوعی بنویسید و از او بخواهید:

  1. توضیح دهد که ویژگی enctype در تگ <form> چیست؟
  2. مقدار پیش‌فرض enctype چیست (application/x-www-form-urlencoded) و برای ارسال فایل باید به چه مقداری (multipart/form-data) تغییر کند؟
  3. مهم‌تر از همه: سوپرگلوبال $_FILES در PHP چیست؟ توضیح دهد که چرا فایل‌ها در $_POST قرار نمی‌گیرند و $_FILES چه اطلاعاتی (مثل نام، حجم، و مسیر موقت فایل) را در اختیار ما قرار می‌دهد.