HTTP BÀI ĐĂNG yêu cầu cung cấp dữ liệu bổ sung từ máy khách (trình duyệt) đến máy chủ trong nội dung thư. Ngược lại, ĐƯỢC yêu cầu bao gồm tất cả dữ liệu cần thiết trong URL. Các biểu mẫu trong HTML có thể sử dụng một trong hai phương thức bằng cách chỉ định phương thức = "BÀI" hoặc là phương thức = "NHẬN" (mặc định) trong thành phần. Phương thức được chỉ định xác định cách gửi dữ liệu biểu mẫu đến máy chủ. Khi phương thức là GET, tất cả dữ liệu biểu mẫu được mã hóa vào URL, được thêm vào hoạt động URL là tham số chuỗi truy vấn. Với POST, dữ liệu biểu mẫu xuất hiện trong nội dung thư của yêu cầu HTTP.
ĐƯỢC | BÀI ĐĂNG | |
---|---|---|
Lịch sử | Các tham số vẫn còn trong lịch sử trình duyệt vì chúng là một phần của URL | Các tham số không được lưu trong lịch sử trình duyệt. |
Đã đánh dấu | Có thể được đánh dấu. | Không thể đánh dấu. |
Nút BACK / gửi lại hành vi | Yêu cầu GET được thực thi lại nhưng có thể không được gửi lại cho máy chủ nếu HTML được lưu trong bộ đệm của trình duyệt. | Trình duyệt thường thông báo cho người dùng rằng dữ liệu sẽ cần phải được gửi lại. |
Kiểu mã hóa (thuộc tính enctype) | application / x-www-form-urlencoding | Multipart / form-data hoặc application / x-www-form-urlencoding Sử dụng mã hóa nhiều phần cho dữ liệu nhị phân. |
Thông số | có thể gửi nhưng dữ liệu tham số được giới hạn ở những gì chúng ta có thể đưa vào dòng yêu cầu (URL). An toàn nhất để sử dụng ít hơn 2K tham số, một số máy chủ xử lý lên đến 64K | Có thể gửi tham số, bao gồm tải tệp lên máy chủ. |
Bị hack | Dễ dàng hơn để hack cho kiddies script | Khó hack hơn |
Hạn chế về kiểu dữ liệu biểu mẫu | Có, chỉ cho phép các ký tự ASCII. | Không hạn chế. Dữ liệu nhị phân cũng được cho phép. |
Bảo vệ | GET kém an toàn hơn so với POST vì dữ liệu được gửi là một phần của URL. Vì vậy, nó được lưu trong lịch sử trình duyệt và nhật ký máy chủ trong bản rõ. | POST an toàn hơn GET một chút vì các tham số không được lưu trong lịch sử trình duyệt hoặc trong nhật ký máy chủ web. |
Hạn chế về độ dài dữ liệu biểu mẫu | Có, vì dữ liệu biểu mẫu nằm trong URL và độ dài URL bị hạn chế. Giới hạn độ dài URL an toàn thường là 2048 ký tự nhưng thay đổi tùy theo trình duyệt và máy chủ web. | Không hạn chế |
Khả năng sử dụng | Không nên sử dụng phương thức GET khi gửi mật khẩu hoặc thông tin nhạy cảm khác. | Phương thức POST được sử dụng khi gửi mật khẩu hoặc thông tin nhạy cảm khác. |
Hiển thị | Phương thức GET hiển thị cho mọi người (nó sẽ được hiển thị trên thanh địa chỉ của trình duyệt) và có giới hạn về lượng thông tin cần gửi. | Các biến phương thức POST không được hiển thị trong URL. |
Đã lưu | Có thể được lưu trữ | Không lưu trữ |
Sự khác biệt cơ bản giữa PHƯƠNG PHÁP = "NHẬN" và PHƯƠNG PHÁP = "BÀI" là chúng tương ứng với các yêu cầu HTTP khác nhau, như được định nghĩa trong thông số kỹ thuật HTTP. Quá trình gửi cho cả hai phương thức bắt đầu theo cùng một cách - một bộ dữ liệu biểu mẫu được trình duyệt xây dựng và sau đó được mã hóa theo cách được chỉ định bởi mã hóa thuộc tính. Dành cho PHƯƠNG PHÁP = "BÀI ĐĂNG các mã hóa thuộc tính có thể là nhiều dữ liệu / biểu mẫu hoặc là application / x-www-form-urlencoding, trong khi đó cho PHƯƠNG PHÁP = "NHẬN", chỉ có application / x-www-form-urlencoding được cho phép. Tập dữ liệu biểu mẫu này sau đó được truyền đến máy chủ.
Để gửi biểu mẫu với METHOD = "GET", trình duyệt sẽ tạo một URL bằng cách lấy giá trị của hoạt động thuộc tính, nối thêm một ? vào đó, sau đó nối thêm tập dữ liệu biểu mẫu (được mã hóa bằng loại nội dung ứng dụng / x-www-form-urlencoding). Trình duyệt sau đó xử lý URL này như thể theo một liên kết (hoặc như thể người dùng đã gõ URL trực tiếp). Trình duyệt chia URL thành các phần và nhận ra một máy chủ, sau đó gửi đến máy chủ đó một yêu cầu GET với phần còn lại của URL làm đối số. Các máy chủ lấy nó từ đó. Lưu ý rằng quy trình này có nghĩa là dữ liệu biểu mẫu được giới hạn ở mã ASCII. Cần đặc biệt chú ý để mã hóa và giải mã các loại ký tự khác khi chuyển chúng qua URL ở định dạng ASCII.
Gửi biểu mẫu với METHOD = "POST" khiến yêu cầu POST được gửi, sử dụng giá trị của hoạt động thuộc tính và thông báo được tạo theo loại nội dung được chỉ định bởi mã hóa thuộc tính.
Vì dữ liệu biểu mẫu được gửi như một phần của URL khi ĐƯỢC Được sử dụng --
Về nguyên tắc, việc xử lý dữ liệu biểu mẫu đã gửi tùy thuộc vào việc nó có được gửi với PHƯƠNG PHÁP = "NHẬN" hoặc là PHƯƠNG PHÁP = "BÀI". Vì dữ liệu được mã hóa theo nhiều cách khác nhau, nên cần có các cơ chế giải mã khác nhau. Do đó, nói chung, việc thay đổi PHƯƠNG PHÁP có thể cần một sự thay đổi trong kịch bản xử lý việc đệ trình. Ví dụ: khi sử dụng giao diện CGI, tập lệnh nhận dữ liệu trong một biến môi trường (QUERYSTRING) khi ĐƯỢC Được sử dụng. Nhưng khi BÀI ĐĂNG được sử dụng, dữ liệu biểu mẫu được truyền trong luồng đầu vào tiêu chuẩn (stdin) và số byte cần đọc được đưa ra bởi tiêu đề Độ dài nội dung.
GET được khuyến nghị khi gửi biểu mẫu "idempotent" - những hình thức không "thay đổi đáng kể trạng thái của thế giới". Nói cách khác, các hình thức chỉ liên quan đến truy vấn cơ sở dữ liệu. Một viễn cảnh khác là một số truy vấn tạm thời sẽ có tác dụng tương tự như một truy vấn duy nhất. Nếu cập nhật cơ sở dữ liệu hoặc các hành động khác như kích hoạt email có liên quan, việc sử dụng POST được khuyến nghị.
Từ blog nhà phát triển Dropbox:
một trình duyệt không biết chính xác một biểu mẫu HTML cụ thể làm gì, nhưng nếu biểu mẫu được gửi qua HTTP GET, trình duyệt biết rằng sẽ an toàn để tự động thử lại việc gửi nếu có lỗi mạng. Đối với các biểu mẫu sử dụng HTTP POST, có thể không an toàn để thử lại để trình duyệt yêu cầu người dùng xác nhận trước.
Yêu cầu "NHẬN" thường được lưu trong bộ nhớ cache, trong khi yêu cầu "POST" khó có thể được. Đối với các hệ thống truy vấn, điều này có thể có tác động hiệu quả đáng kể, đặc biệt nếu các chuỗi truy vấn đơn giản, vì bộ đệm có thể phục vụ các truy vấn thường xuyên nhất.
Trong một số trường hợp nhất định, sử dụng BÀI ĐĂNG được khuyến nghị ngay cả đối với các truy vấn tạm thời:
Cập nhật ngày 15 tháng 5 năm 2015: Cụ thể khi sử dụng HTTPS (HTTP qua TLS / SSL), POST có cung cấp bảo mật hơn bất kỳ GET nào không?
Đây là một câu hỏi thú vị. Giả sử bạn thực hiện một yêu cầu GET cho một trang web:
NHẬN https://www.example.com/login.php?user=mickey&passwd=mini
Giả sử rằng kết nối Internet của bạn đang được theo dõi, thông tin nào về yêu cầu này sẽ có sẵn cho người rình mò? Nếu POST được sử dụng thay thế và dữ liệu người dùng và mật khẩu được bao gồm trong các biến POST, sẽ an toàn hơn trong trường hợp kết nối HTTPS?
Câu trả lời là không. Nếu bạn thực hiện một yêu cầu GET như vậy, chỉ những kẻ tấn công mới biết được thông tin sau đây sẽ theo dõi lưu lượng truy cập web của bạn:
Phần đường dẫn của URL - tức là, trang thực tế được yêu cầu, cũng như các tham số chuỗi truy vấn - được bảo vệ (được mã hóa) trong khi chúng "qua dây", tức là đang trên đường đến máy chủ đích. Tình huống này hoàn toàn giống với các yêu cầu POST.
Tất nhiên, các máy chủ web có xu hướng ghi nhật ký toàn bộ URL bằng văn bản thuần trong nhật ký truy cập của chúng; vì vậy gửi thông tin nhạy cảm qua GET không phải là một ý tưởng tốt. Điều này áp dụng bất kể liệu HTTP hay HTTPS được sử dụng.