بدون شک هر کسی که در حوزه وب فعالیت داشته با فرم های HTML کار کرده. وقتی شما اطلاعات شخصیتون رو در سایتی وارد می کنید و سپس دکمه submit رو می زنید در واقع اطلاعاتتون رو در یک فرم HTML قرار داده اید. فرم ها برای ارسال اطلاعات از مرورگر کاربر به سمت وب سرور استفاده می شوند.
برای مثال وقتی در سرویس Gmail وارد می شوید, نام کاربری و رمز عبورتان را در داخل یک فرم HTML وارد  می کنید و با انتخاب sign in , نام کاربری و رمز عبورتان را در قالب یک فرم HTML به وب سرور Google ارسال می کنید.
دو راه برای ارسال شدن فرم شما از مرورگر به سمت وب سرور وجود دارد که در HTML می توان با کمک مشخصه ی method آن را تعیین کرد.
<form method="POST"></form>
<form method="GET"></form>
زمانی که یک فرم submit می شود , یک درخواست HTTP که مسئول انتقال داده ها به وب سرور هست ایجاد می شود. این طور تصور کنید که HTTP زبان مشترک مرورگر شما و وب سرور است و نوع این درخواست HTTP به متد استفاده شده در فرم بستگی دارد.
اگر در فرم از متد GET استفاده کنیم , پارامترهای فرم کدگزاری شده و به همراه URL ارسال می شوند که این روش را "query string" می نامند. پارامترهای فرم هم میتواند هر چیزی باشد برای مثال ایمیل و رمز عبور برای ورود به یک سایت و یا نام و نام خانوادگی و رمز عبور برای ثبت نام در یک وب سایت که در شکل زیر مثالی برای حالت دوم در نظر گرفته شده است.


همانطور که می بینید پارامترهای فرم (regName,regFamily,regPass) به همراه مقادیرشان در انتهای URL اضافه شده اند. البته به هیچ وجه استفاده از متد GET برای فرم های ثبت نام یا ورود کاربر توصیه نمی شود که در ادامه بحث به دلیل استفاده نکردن از آن می پردازیم.
متد POST برخلاف متد GET , اطلاعات را در URL ارسال نمی کند بلکه آنها را در قالب بدنه درخواست HTTP  ارسال می کند و در نتیجه امنیت بالاتری نیز دارد. پس جز موارد خاص مانند فرم های جست و جو (کمتر از 10% فرم ها) در بقیه فرم ها از متد POST استفاده خواهیم کرد. در ضمن اگر متد فرم را مشخص نکنیم , مرورگر به طور پیش فرض از متد GET استفاده می کند.


برای دریافت پارمترهای فرم ارسالی می توان از آرایه های سوپرگلوبال POST و GET به صورت زیر استفاده کرد.
<?php 
if (isset($_POST['sub'])) {
    echo "username: ".$_POST['username']."<br/>";
    echo "password: ".$_POST['password'];
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test Form</title>
</head>
<body>
    <form action="" method="post">
        username:<input type="text" name="username">
        password:<input type="text" name="password">
        <input type="submit" name="sub">
    </form>
</body>
</html>

مقادیر $_POST['username'] و $_POST['password'] به ترتیب مقادیر username و password را نمایش می دهند. در ادامه به تفاوت درخواست های POST و GET می پردازیم...
 

متد GET
  • به راحتی bookmark می شود.
  • در مرورگر کاربر cache می شود.
  • پارامترها در history کاربر به جا می مانند زیرا جزئی از URL هستند.
  • پارامترها را در قالب URL ارسال می کنند و معمولا تا حداکثر 2KB می تواند ارسال شود. ( بعضی سرورها تا 64KB را نیز پشتیبانی می کنند)
  • به سادگی قابل هک شدن هستند.
  • فقط کاراکترهای ASCII مجاز است.
  • دارای امنیت به شدت پایین می باشد.
  • برای ارسال داده های مهم اعم از رمز عبور , مناسب نیست.
  • امکان ارسال حداکثر 7607 کاراکتر  برای داده های بزرگ وجود دارد.
 
متد POST
  • Bookmark  نمی شود.
  • در مرورگر کاربر cache نمی شود.
  • در هنگام ارسال دوباره فرم (فشردن کلید F5) , مرورگر پیغامی را به کاربر نمایش می دهد مبنی بر ارسال و ثبت مجدد اطلاعات.
  • میتوان فایل آپلود کرد.
  • هک کردن آن مشکل تر است.
  • برخلاف کاراکترهای ASCII , داده های Binary هم مجاز است.
  • برای ارسال داده های مهم مناسب است.
  • متغیرهای ارسالی توسط این متد , در URL نمایش داده نخواهد شد.
  • امکان ارسال حداکثر 8MB  برای داده های بزرگ وجود دارد.
  دقت کنید که جز در شرایط خیلی خاص , در اکثر مواقع از متد POST استفاده کنید..

اما مقایسه :

برای ارسال اطلاعات فرمهای HTML از مرورگر کاربر به سرور از دو متد GET و POST که هر دو متعلق به پروتکل HTTP میباشند، استفاده می گردد. در زبان HTML برای تعیین اینکه از کدام متد استفاده کنیم، از صفت Method متعلق به المان Form استفاده می کنیم. این دو متد تفاوتهایی دارند که در جدول زیر بیان شده است یکی از این تفاوتها این است که متد GET ،اطلاعات ارسالی را به URL اضافه و ارسال می کند به مثال زیر توجه کنید:

<form name="form1" action="register.php" method="GET">

Name : <input type="text" name="fname" /><br>

Age : <input type="text" name="age" /><br>

<input type="submit" name="submit" value="SEND" />

</form>

فرم بالا شامل دو فیلد fname و age و یک دکمه با نام SEND می باشد این فرم اطلاعات خودش را به روش GET به صفحه register.php ارسال می کند. حال اگر فیلدهای fname و age را به ترتیب برابر Ali و 21 قرار دهیم و فرم را ارسال کنیم. شکل URL در نوار آدرس مرورگرتان به این صورت در می آید.

http://www. yourSite.com/register.php?fname=Ali&age=21

حال اگر فرم بالا را به روش POST ارسال کنیم URL ما به صورت زیر خواهد بود.

http://www.yourSite.com/register.php

ویژگی

متد GET

متد POST

استفاده از دکمه های BACK و Reload

بی اثر

ارسال دوباره اطلاعات (البته قبل از ارسال شدن دوباره اطلاعات مرورگر به کاربر هشدار میدهد)

Bookmark کردن

با زدن کلیدهای ctrl + D آدرس bookmark میشود.

قابلیت bookmark را ندارد.

قابلیت کش – Cache

کش میشود.

قابلیت کش را ندارد.

نوع رمزگذاری – Encoding

application/x-www-form-urlencoded

application/x-www-form-urlencoded

 

multipart/form-data

 

از multipart/form-data برای رمزگذاری داده های باینری معمولا هنگام آپلود کردن فایلها استفاده میشود. یعنی برای آپلود فایل از این نوع استفاده می کنیم.

ذخیره شدن در تاریخچه مرورگر – History

ردپای متد GET در تاریخچه مرورگر ذخیره میشود.

ذخیره نمیشود.

محدودیت در اندازه داده

متد GET اطلاعات خودش را به URL اضافه میکند. و از طرفی حداکثر اندازه URL میتواند 2048 کاراکتر باشد.

بدون محدودیت

محدودیت در نوع داده

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

بدون محدودیت. قابلیت ارسال داده های باینری را دارد.

امنیت

امنیت کمتری نسبت به POST دارد.از این متد برای ارسال اطلاعات حساسی مانند کلمه عبور استفاده نکنید.

نسبت به متد GET از امنیت بیشتری برخوردار است.پارامترهای ارسالی در تاریخچه مرورگر و در سیستم لاگ وب سرور ذخیره نمی شوند.

قابلیت مشاهده

اطلاعات در URL توسط همه قابل مشاهده است.

قابل مشاهده نیست.



HTTP Methods: GET vs. POST

The two most used HTTP methods are: GET and POST.

What is HTTP?

The Hypertext Transfer Protocol (HTTP) is designed to enable communications between clients and servers.

HTTP works as a request-response protocol between a client and server.

A web browser may be the client, and an application on a computer that hosts a web site may be the server.

Example: A client (browser) submits an HTTP request to the server; then the server returns a response to the client. The response contains status information about the request and may also contain the requested content.


Two HTTP Request Methods: GET and POST

Two commonly used methods for a request-response between a client and server are: GET and POST.

  • GET - Requests data from a specified resource
  • POST - Submits data to be processed to a specified resource

The GET Method

Note that the query string (name/value pairs) is sent in the URL of a GET request:

/test/demo_form.php?name1=value1&name2=value2

Some other notes on GET requests:

  • GET requests can be cached
  • GET requests remain in the browser history
  • GET requests can be bookmarked
  • GET requests should never be used when dealing with sensitive data
  • GET requests have length restrictions
  • GET requests should be used only to retrieve data

The POST Method

Note that the query string (name/value pairs) is sent in the HTTP message body of a POST request:

POST /test/demo_form.php HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

Some other notes on POST requests:

  • POST requests are never cached
  • POST requests do not remain in the browser history
  • POST requests cannot be bookmarked
  • POST requests have no restrictions on data length

Compare GET vs. POST

The following table compares the two HTTP methods: GET and POST.

  GET POST
BACK button/Reload Harmless Data will be re-submitted (the browser should alert the user that the data are about to be re-submitted)
Bookmarked Can be bookmarked Cannot be bookmarked
Cached Can be cached Not cached
Encoding type application/x-www-form-urlencoded application/x-www-form-urlencoded or multipart/form-data. Use multipart encoding for binary data
History Parameters remain in browser history Parameters are not saved in browser history
Restrictions on data length Yes, when sending data, the GET method adds the data to the URL; and the length of a URL is limited (maximum URL length is 2048 characters) No restrictions
Restrictions on data type Only ASCII characters allowed No restrictions. Binary data is also allowed
Security GET is less secure compared to POST because data sent is part of the URL

Never use GET when sending passwords or other sensitive information!
POST is a little safer than GET because the parameters are not stored in browser history or in web server logs
Visibility Data is visible to everyone in the URL Data is not displayed in the URL

Other HTTP Request Methods

The following table lists some other HTTP request methods:

Method Description
HEAD Same as GET but returns only HTTP headers and no document body
PUT Uploads a representation of the specified URI
DELETE Deletes the specified resource
OPTIONS Returns the HTTP methods that the server supports
CONNECT Converts the request connection to a transparent TCP/IP tunnel