NHẬN so với POST

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.

Biểu đồ so sánh

Biểu đồ so sánh GET so với POST
ĐƯỢCBÀ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ữ

Nội dung: NHẬN vs POST

  • 1 sự khác biệt trong việc nộp mẫu
    • 1.1 Ưu và nhược điểm
  • 2 sự khác biệt trong xử lý phía máy chủ
  • 3 đề nghị sử dụng
  • 4 Điều gì về HTTPS?
  • 5. Tài liệu tham khảo

Sự khác biệt trong đệ trình mẫu

Sự khác biệt cơ bản giữa PHƯƠNG PHÁP = "NHẬN"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.

Ưu và nhược điểm

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 --

  • 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. Mặt khác, dữ liệu nhị phân, hình ảnh và các tệp khác đều có thể được gửi qua PHƯƠNG PHÁP = "BÀI"
  • Tất cả dữ liệu biểu mẫu điền vào được hiển thị trong URL. Hơn nữa, nó cũng được lưu trữ trong lịch sử / nhật ký duyệt web của người dùng cho trình duyệt. Những vấn đề này làm ĐƯỢC kém an toàn.
  • Tuy nhiên, một lợi thế của dữ liệu biểu mẫu được gửi như một phần của URL là người ta có thể đánh dấu các URL và trực tiếp sử dụng chúng và bỏ qua hoàn toàn quy trình điền vào biểu mẫu.
  • Có giới hạn về số lượng dữ liệu biểu mẫu có thể được gửi vì độ dài URL bị giới hạn.
  • Script kiddies có thể dễ dàng lộ các lỗ hổng trong hệ thống để hack nó. Ví dụ: Citibank đã bị hack bằng cách thay đổi số tài khoản trong chuỗi URL.[1] Tất nhiên, tin tặc hoặc nhà phát triển web có kinh nghiệm có thể phơi bày những lỗ hổng như vậy ngay cả khi POST được sử dụng; nó chỉ khó hơn một chút. Nói chung, máy chủ phải nghi ngờ bất kỳ dữ liệu nào được gửi bởi khách hàng và bảo vệ chống lại Tài liệu tham khảo đối tượng trực tiếp không an toàn.

Sự khác biệt trong xử lý phía máy chủ

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.

Khuyến nghị sử dụng

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:

  • Nếu dữ liệu biểu mẫu sẽ chứa các ký tự không phải ASCII (chẳng hạn như các ký tự có dấu), sau đó PHƯƠNG PHÁP = "NHẬN" không thể áp dụng về nguyên tắc, mặc dù nó có thể hoạt động trong thực tế (chủ yếu cho các ký tự ISO Latin 1).
  • Nếu tập dữ liệu biểu mẫu lớn - nói, hàng trăm ký tự - sau đó PHƯƠNG PHÁP = "NHẬN" có thể gây ra sự cố thực tế với việc triển khai không thể xử lý các URL dài đó.
  • Bạn có thể muốn tránh PHƯƠNG PHÁP = "NHẬN" để làm cho người dùng ít nhìn thấy cách thức biểu mẫu hoạt động, đặc biệt là để làm cho các trường "ẩn" (INPUT TYPE = "HIDDEN") bị ẩn đi nhiều hơn bằng cách không xuất hiện trong URL. Nhưng ngay cả khi bạn sử dụng các trường ẩn với PHƯƠNG PHÁP = "BÀI", chúng vẫn sẽ xuất hiện trong mã nguồn HTML.

HTTPS thì sao?

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:

  1. Thực tế là bạn đã thực hiện kết nối HTTPS
  2. Tên máy chủ - www.example.com
  3. Tổng chiều dài của yêu cầu
  4. Độ dài của phản hồi

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.

Người giới thiệu

  • wikipedia: POST (HTTP)
  • Phương thức yêu cầu HTTP
  • Bài đăng HTTP - W3.org
  • Nhận HTTP - W3.org
  • HTTPS có ẩn các URL đang được truy cập không? - Giao dịch cổ phiếu