متغیر$_POST
و $_GET
در php بخشی از متغیرهای سراسری هستند و در همه جای اسکریپت می توانید از آنها استفاده کنید ، هر دو متغیر $_POST
و $_GET
داده های ارسال شده توسط متدهای post و get از html را دریافت می کنند.
در مثال زیر میبینید که چطوری از این ها برای جمعاوری داده های ارسال شده از فرم html استفاده می کنیم
جمعاوری داده از فرم html
صفحه html زیر شامل یک فرم با عناصر ورودی مثل متن ، چند انتخابی ، یک انتخابی ، دکمه است . زمانی که کاربر این فیلد ها را تکمیل می کند و دکمه ارسال یا همان submit را میزند ، داده ها به صفحه grab_values.php
ارسال می شود ، همان آدرسی که در قسمت action فرم تعریف شده است.
عکس زیر یک فرم ساده html با متد post را نشان میدهد . عکس بعدی نتیجه ارسال و دریافت داده های ورودی کاربر توسط php را نمایش می دهد.
متد get در html
در فرم html زیر ما در قسمت method ، روش ارسال دیتا به سرور را مشخص می کنیم.
1 2 3 4 5 |
<form action="grab_values.php" method="GET"> User Name: <input type="text" name="user_name" /> Location: <input type="text" name="user_location" /> <input type="submit" value="Submit"> </form> |
توسط php ، ما فقط با استفاده از آرایه گلوبال یا همان سراسری $_GET
مقادیر ورودی را دریافت و چاپ می کنیم.
1 2 3 4 |
<?php echo 'Hi '.$_GET["user_name"]; echo $_GET["user_location"].' is a cool place'; ?> |
نقص متد get در html این است که مقادیر ارسال شده به سرور در آدرس بار مرورگر نمایش داده می شود ، پس ارسال اطلاعات حساسی مثل رمزهای عبور ، کلید های سکرت با استفاده از متد GET توصیه نمی شود.
همچنین طول کاراکترهای قابل ارسال توسط این متد به خاطر مرورگر های مختلف محدود شده است.
از جمله ویژگی های متد GET می توان به موارد زیر اشاره کرد:
- درخواست هایی از جنس GET قابلیت Cache شدن دارند.
- درخواست هایی از جنس GET در تاریخچه ی مرورگر کاربر باقی می مانند.
- درخواست هایی از جنس GET را می توان Bookmark کرد.
- درخواست هایی از جنس GET را هرگز نمی بایست برای داده های حساس مثل اطلاعات حساب کاربری مورد استفاده قرار داد.
- درخواست هایی از جنس GET از لحاظ حجم داده ها دارای محدودیت هستند. حداکثر کاراکتری که از طریق یو آر ال می توان ارسال کرد، چیزی در حدود ۲۰۴۸ کاراکتر است.
- درخواست هایی از جنس GET بهتر است که بیشتر برای دریافت اطلاعات مورد استفاده قرار گیرند.
- درخواست هایی از جنس GET دارای امنیت پایینی هستند چرا که داده ها به عنوان بخشی از یو آر ال ارسال می شوند.
- از متد GET هرگز نمی توان برای داده های باینری مثل تصاویر و … استفاده نمود.
پس پیشنهاد می شود از متد POST برای ارسال دیتا به سرور استفاده کرد.
متد POST در html
حجم بالایی از دیتا از طریق متد POST قابل ارسال است. از HTML 4.0 به بعد همچنین قابلیت ارسال multipart/form-data
اضافه شد. متد post امن تر از Get است بدلیل اینکه مقادیر ورودی از طریق url قابل مشاهده نیستند و همچنین در تاریخچه (history) مرورگر ذخیره نمی شود.
برای استفاده از متد post کافیست که مقدار method را به POST تغییر بدید:
1 2 3 4 5 |
<form action="grab_values.php" method="POST"> User Name: <input type="text" name="user_name" /> Location: <input type="text" name="user_location" /> <input type="submit" value="Send My Info"> </form> |
توسط php ، ما فقط با استفاده از آرایه گلوبال یا همان سراسری $_POST مقادیر ورودی را دریافت و چاپ می کنیم.
1 2 3 4 |
<?php echo 'Hi '.$_POST["user_name"]; echo $_POST["user_location"].' is a cool place'; ?> |
مزیت های استفاده از متد POST:
- درخواست هایی از جنس POST هرگز Cache نمی شوند.
- درخواست هایی از جنس POST در تاریخچه ی مرورگر باقی نخواهند ماند
- درخواست هایی از جنس POST قابلیت Bookmark شدن ندارند.
- هیچ گونه محدودیتی در ارتباط با میزان داده هایی که از طریق متد POST می توان به سمت سرور فرستاد وجود ندارد.
- از متد POST می توان برای انتقال داده های باینری مثل تصاویر و … استفاده نمود.
مدیریت خطا (Error Handling) :
همیشه زمانی که در حال دریافت اطلاعات از متد POST/GET هستیم باید مراقب باشیم ، چونکه اگر کاربریه مقدار خالی را ارسال کند ،
اسکریپت PHP بالا یک خطایی را نشان می دهد. برای جلوگیری از نمایش اینگونه خطاهای غیرضروری می توانیم از توابع کنترلی مثل isset()
استفاده کنیم . این تابع در صورتی که متغییر وحود داشته باشد مقدار TRUE
را برمیگرداند.
خب اجازه بدید یک خطای دوستانه برای به جای خطای خود PHP نشان بدهیم .خب برای مدیریت خطا فایل grab_values.php
را ویرایش می کنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php //!(exclamation mark) returns the opposite value of the boolean variable, //it means isset() will return true if value is empty. if(!isset($_POST["user_name"])) //isset returns true when value is empty { die("Please go back and enter name"); //exit page after outputting the message. } if(!isset($_POST["user_location"])) { die("Please go back and enter Location"); //exit page after outputting the message. } //output result echo 'Hi '.$_POST["user_name"]; echo $_POST["user_location"].' is a cool place'; ?> |
مثال بالا ساده ترین راه برای مدیریت خطا است اما راه های بهتری مثل تابع exit
وحود دارد . امیدوارم این مقاله به شما در درک و یادگیری متغیر$_POST
و $_GET
و مدیریت خطا کمک کرده باشد .
امنیت ورودی های کاربر
به هیچ وجه ورودی های خام که از کاربر دریافت می کنید را در برنامه خود استفاده نکنید و یا اگر این ورودی ها را مستقیم در کویری SQL استفاده می کنید , احتمال لو رفتن تمام اطلاعات دیتابیس و یا هک شدن کل سایت شما بسیار بالاست . برای همین ورودی های کاربر را قبل از استفاده در کویری ها و ذخیره در دیتابیس , با توابعی که مربوط به امنیت فرم ها است و در مقاله اعتبار سنجی فرم ها در php آوردیم , بهره ببرید.
هر سوال یا مشکلی وجود داشت لطفا در نظرات این نوشته ارسال کنید . سریعا پاسخگوی سوالات شما هستیم .
مرسی . موفق و پیروز باشید
سلام استاد شفیعی گل
من تو فرم با متد get مقدار value قیمت و کارکرد و … رو از url گرفتم و قرار دادم و مشکل کلا حل شد حالا هم فیلتر های قبلی میمونه و هم فیلتر مثلا price جایگزین price قبلی میشه
سپاس از راهنمایی هاتون
مهندس شفیعی ممنون از راهنمایی تون من وقتی که url قبلی رو با جدید ترکیب کردم یه حالتی پیش میاد مثلا تو url قبلی فیلتر قیمت price وجود داره تو url جدید هم کاربر قیمت رو انتخاب میکنه دو تا price هست چیکار کنم که دومی جایگزین اولی بشه از چه تابعی یا روشی استفاده کنم ؟
ممنون از راهنمایی تون موفق باشید
با این کد میتونید پارامترهای url رو بگیرید ببینید چیا داره اگه از قبل وجود داشت مقدار جدید رو جایگزین می کنید و اگه وجود نداشت پارامتر جدید میزارید. این موارد تماما با جاواسکریپت انجام میشه
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const price = urlParams.get(‘price’)
console.log(price);
مقدار قیمت و داخل کنسول مرورگر برگشت میده
سلام استاد شفیعی خداقوت
من برای فیلتر کردن آگهی خودرو از متد get استفاده کردم و اطلاعات رو از url میگیرم و کاربر میتونه بر اساس کارکرد یا قیمت و … فیلتر کنه
وقتی بر اساس مثلا قیمت فیلتر میکنه و آگهی نشون داده میشه دوباره وقتی میخواد بر اساس کارکرد هم فیلتر کنه با ارسال فرم فیلتر قیمت از بین میره
من میخوام هر بار که فیلتر میکنه فیلتر قبلی هم حفظ بشه میشه راهنمایی کنید برای این موضوع چیکار کنم ؟
مثل وبسایت دیوار منظورمه
سلام. ممنون
وقتی فیلتر میشه و url تغییر میکنه اون url رو توی فرم action قرار بدید یا اینکه داخل کوکی ذخیره کنید این کار رو با جاواسکریپت باید انجام بدید
سلام
اگه کلا از متد POST استفاده کنیم و از GET استفاده نکنیم مشکلی پیش نمی آید؟
سلام. خیلی هم خوبه و اصلا مشکلی نداره
مفید بود
خوشحالیم که مفید واقع شده.
موفق باشید.
سلام خسته نباشید . من وقتی داخل فایل php از متد post برای دریافت اطلاعات از سمت کلاینت استفاده میکنم ، از postman متغیر ها رو براش با متد post میفرستم ولی با post متغیر ها رو خالی دریافت میکنه درحالی که اگر همونو با get بنویسم درست دریافتش میکنه نمیدونم مشکلش کاست؟ممنون میشم اگه راهنمایی لازم رو بکنید.
سلام. ممنون.
مطمین باشید که آرایه گلوبال مناسب رو در کد php خود فراخوانی می کنید که برای post همان $_POST است که البته میتونید از $_REQUEST هم استفاده کنید. پس بهتر است این متغییر ها رو یکبار var_dump کنید تا ببینید چه داده ای داخل آنها قرار گرفته شده.
البته ممکن است مشکل از ست کردن شما در postman باشه میتونید داخل یک فرم که نحوه ساخت آن را می دونید (تگ form و خصوصیت method=post) این کار رو دستی بدون postman انجام بدید تا مطمین شوید
موفق باشید.
سلام اگه بخوام یه input داشته باشم از نوع تکست که چیزی که کاربر مینویسه زیرش نمایش داده بشه .و بعد دوباره تو همون input چیزدیگری نوشت نمایش تکست قبلی پاک نشه و زیر هم نشون داده بشه چیکار کنم؟
سلام. این موارد با جاوا اسکریپت انجام میشه که با جی کویری هم راحتی خودش رو داره.
با جی کویری شما سلکتور رو روی رویداد keyup قرار می دیدید و داخل آن تابع مورد نظر را برای نوشتن value این input داخل تگ مورد نظر زیر همان فیلد می نویسید.
موفق باشید.
ممنون از پاسخ کاملتون . این جوری که من مطالعه کردم کاربر میتونه از طریق مرورگر هدر referrer رو غیر فعال کنه . به نظرتون اینکه یک توکن برای هر فرم ساخته بشه میتونه امنیت رو کاملا تامین کنه ؟
خواهش می کنم. بله مبحث csrf هم مبتنی بر اختصاص دادن یک کلید اختصاصی یا همان توکن است که بسیار میتونه جلوی این حملات رو بگیره.
سلام . در صورتی که بخوایم از هر آدرسی غیر از آدرس سایت خودمون ، از ارسال پارامتر به صفحات سایتمون جلوگیری کنیم باید چیکار کنیم ؟
برای مثال اگر ما سایت الف باشیم و سایت دیگری به نام سایت جیم وجود داشته باشه ، سایت جیم نتونه به سایت ما پارامتری از جنس گت یا پست ارسال کنه
سلام. در مورد حملات CSRF جستجو کنید. همچنین در کد نویسی سایت مشخص کنید که اگر درخواستی با پارامترهایی ارسال شد هدر referer بررسی و اعتبارسنجی بشه.
بعضی کارها هم نیاز به دسترسی کامل به سرور برای انجام تغییرات در فایل های پیکربندی وب سرور هست که آنقدرها هم نیاز نیست و راهکارهای بالا کارساز هستش.
موفق باشید.
ببخشید سوالی داشتم از خدمتتون موقعی که مقدار ارسال شده به url رو با $_GET میگیریم برای امنیتش چه کدی باید استفاده کنیم؟
برای امنیت باید هنگام دریافت اون از طریق آرایه های $_GET یا $_POST با توابعی مثل strip_tags یا htmlspecialchars و یا اگر فقط قصد دریافت مقدار عددی دارید با تابع intval موارد اضافی رو پاک کنید . همچنین استفاده از تابع filter_var بسیار در این مورد مفید هستش.
در مورد امنیت فرم ها و ورودی های کاربر که از طریق url یا متد POST ارسال میشود در این مقاله به طور کامل به این موضوع پرداختیم
اعتبارسنجی فرم ها در php
موفق و پیروز باشید
ممنون از پاسختون
خواهش می کنم . موفق باشید