2010-01-17 66 views

Trả lời

68

Trong yêu cầu HTTP GET, cặp khóa/giá trị được chỉ định trong URL:

http://server/something?value1=foo&value2=bar.

Trong yêu cầu HTTP POST, cặp khóa/giá trị được gửi như một phần của yêu cầu HTTP sau tiêu đề. Ví dụ:

 
POST /something HTTP/1.1 
Host: server 
Content-Length: 21 
Content-Type: application/x-www-form-urlencoded 

value1=foo&value2=bar 

Thật khó để mô tả một cách an toàn hơn hoặc ít hơn, nhưng dữ liệu HTTP POST không hiển thị trong URL và khi gửi dữ liệu đến trang web, HTTP POST thường có thể chỉ được thực hiện như là kết quả của tương tác người dùng (ví dụ, nhấp vào nút "Gửi").

Điều này có nghĩa là người dùng không thể bị lừa khi truy cập URL như http://server/update_profile?name=I_suck và dữ liệu nhạy cảm không được hiển thị trong URL.

Bạn cũng có thể sử dụng nonces và các mã thông báo chống giả mạo khác với các biểu mẫu html (sử dụng POST) để ngăn chặn các hình thức giả mạo yêu cầu chéo trang khác.

Nói chung, POST nên được sử dụng cho các yêu cầu có khả năng sửa đổi trạng thái trên máy chủ và GET nên được sử dụng cho các hoạt động chỉ đọc.

15

Tôi sẽ không gọi POST nhiều hơn hoặc ít bảo mật hơn GET. Phải thừa nhận rằng các thông số được hiển thị như một phần của URL khi sử dụng GET, vì vậy mọi dữ liệu nhạy cảm sẽ hiển thị ngay lập tức cho người dùng. Tuy nhiên, nó là tầm thường để xem và thậm chí thay đổi bất kỳ phần nào của yêu cầu HTTP, vì vậy chỉ vì POST không truyền dữ liệu thông qua URL, nó vẫn có thể dễ dàng được đọc. Trừ khi bạn đang sử dụng HTTPS, cả GET và POST sẽ chuyển dữ liệu ở dạng dễ truy cập.

+0

Câu trả lời hay! +1 – whiskeysierra

9

GET method chỉ dành cho truy xuất dữ liệu và should not have any side-effects. Nhưng POST có nghĩa là cho mục đích cụ thể đó: thay đổi dữ liệu ở phía máy chủ.

Yêu cầu GET có thể dễ dàng bị bỏ qua (xem Cross-Site Request Forgery) bằng cách chỉ đặt hình ảnh trên trang trong khi giả mạo yêu cầu POST không dễ dàng (đây cũng là lý do tại sao bạn chỉ cho phép yêu cầu POST được ủy quyền).

+0

+1 Tôi đã tham chiếu câu trả lời này trên Security.SE tại đây: http://security.stackexchange.com/a/12756/396 – LamonteCristo

56

Các HTTP specification biệt POST và GET về ý định của họ:

GET là idempotent: nó là dành cho việc thu thập tài nguyên, mà không thay đổi bất cứ điều gì trên máy chủ. Kết quả là hoàn toàn an toàn để gửi lại yêu cầu GET.

BÀI ĐĂNG không phải là: đó là để cập nhật thông tin trên máy chủ. Do đó, nó có thể không được giả định rằng nó là an toàn để gửi lại yêu cầu đó là lý do tại sao hầu hết các trình duyệt yêu cầu xác nhận khi bạn nhấn làm mới trên một yêu cầu POST.

Về mặt bảo mật, không có sự khác biệt. POST thì càng mơ hồ, có lẽ, nhưng đó là một điều rất khác. Bảo mật cần được thêm vào một lớp khác, ví dụ như SSL.

+1

+1 để trở thành câu trả lời hoàn hảo đơn giản –

21

Một số lưu ý về yêu cầu GET:

  1. yêu cầu GET có thể được lưu trữ
  2. yêu cầu GET lại trong lịch sử trình duyệt
  3. yêu cầu GET có thể được đánh dấu
  4. yêu cầu GET không bao giờ nên được sử dụng khi giao dịch với dữ liệu nhạy cảm
  5. Yêu cầu GET có các giới hạn độ dài
  6. Chỉ yêu cầu GET chỉ được sử dụng lại dữ liệu trieve

Một số lưu ý về yêu cầu POST:

  1. yêu cầu POST không bao giờ lưu trữ
  2. yêu cầu POST không ở lại trong lịch sử trình duyệt
  3. yêu cầu POST Không thể đánh dấu
  4. yêu cầu POST không có giới hạn về độ dài dữ liệu

(Sour ce: W3 Schools)

Các vấn đề liên quan