سطح B: ارسال امن داده (متد POST)
در سطح A دیدیم که متد GET دادهها را به URL اضافه میکند. این کار برای اطلاعات غیرحساس ساده و کاربردی است، اما یک مشکل امنیتی بزرگ دارد. در این سطح، با متد POST آشنا میشویم که روش استاندارد برای ارسال اطلاعات حساس (مانند فرمهای ورود و ثبتنام) است.
محتوای آموزشی
۱. مشکل GET چیست؟
تصور کنید یک فرم ورود ساختهاید. اگر از method="GET" استفاده کنید، URL نهایی چیزی شبیه به این خواهد بود:
login.php?username=my_user&password=MySecret123
این یک فاجعه امنیتی است! چرا؟
- رمز عبور در نوار آدرس مرورگر قابل مشاهده است. (هر کسی که کنار شماست آن را میبیند)
- رمز عبور در تاریخچه (History) مرورگر ذخیره میشود.
- اگر لینک را کپی کنید و جایی بفرستید، رمز عبور هم همراه آن ارسال میشود.
- URLها محدودیت طول دارند (حدود ۲۰۰۰ کاراکتر)، پس برای ارسال دادههای طولانی (مثل متن یک مقاله) مناسب نیستند.
۲. راهحل: متد 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) با دو فیلد بسازید:
- «نام کاربری» با
name="username" - «رمز عبور» با
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ه: یک پرامپت برای هوش مصنوعی بنویسید و از او بخواهید:
- توضیح دهد که ویژگی
enctypeدر تگ<form>چیست؟ - مقدار پیشفرض
enctypeچیست (application/x-www-form-urlencoded) و برای ارسال فایل باید به چه مقداری (multipart/form-data) تغییر کند؟ - مهمتر از همه: سوپرگلوبال
$_FILESدر PHP چیست؟ توضیح دهد که چرا فایلها در$_POSTقرار نمیگیرند و$_FILESچه اطلاعاتی (مثل نام، حجم، و مسیر موقت فایل) را در اختیار ما قرار میدهد.