Có ai có thể giải thích sự khác biệt giữa HTTP-GET và HTTP-POST không? Và tại sao mọi người nói rằng HTTP-POST yếu hơn về an ninh?Sự khác biệt giữa HTTP-Get và HTTP-POST là gì và tại sao HTTP-POST yếu hơn về mặt bảo mật
Trả lời
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.
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.
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).
+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
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 để trở thành câu trả lời hoàn hảo đơn giản –
Một số lưu ý về yêu cầu GET:
- yêu cầu GET có thể được lưu trữ
- yêu cầu GET lại trong lịch sử trình duyệt
- yêu cầu GET có thể được đánh dấu
- 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
- Yêu cầu GET có các giới hạn độ dài
- 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:
- yêu cầu POST không bao giờ lưu trữ
- yêu cầu POST không ở lại trong lịch sử trình duyệt
- yêu cầu POST Không thể đánh dấu
- yêu cầu POST không có giới hạn về độ dài dữ liệu
(Sour ce: W3 Schools)
- 1. Sự khác nhau giữa [AcceptVerbs (HttpVerbs.Post)] và [HttpPost] là gì?
- 2. asp.net mvc - [HttpPost/HttpGet] so với [AcceptVerbs (HttpVerbs.Post/Get)]
- 3. Sự khác biệt giữa Trusted_Connection và Bảo mật tích hợp trong chuỗi kết nối là gì?
- 4. Sự khác nhau giữa mã thông báo bảo mật và vé bảo mật là gì?
- 5. sự khác biệt giữa DoCmd.SetWarnings và CurrentDB.Execute là gì
- 6. Sự khác biệt giữa thông tin bảo mật liên tục và bảo mật tích hợp?
- 7. Sự khác biệt giữa ".equals" và "==" là gì?
- 8. Sự khác nhau giữa @Secured và @PreAuthorize trong bảo mật mùa xuân 3 là gì?
- 9. Sự khác biệt giữa (string [] args) và System.Environment.CommandLine là gì?
- 10. Sự khác biệt giữa build.sbt và build.scala là gì?
- 11. Sự khác biệt giữa .closest() và .parents ('selector') là gì?
- 12. Sự khác biệt giữa while (true) và loop là gì?
- 13. Được bảo mật hơn và tại sao JSON hoặc XML
- 14. Sự khác nhau giữa bảo mật điểm-điểm và đầu cuối là gì?
- 15. Sự khác biệt giữa gói android.opengl và javax.microedition.khronos.opengles là gì?
- 16. Sự khác biệt giữa yếu tố WPF TextBlock và Kiểm soát nhãn là gì?
- 17. Sự khác biệt giữa gmake và thực hiện là gì?
- 18. Sự khác biệt giữa tệp * .bat và * .cmd là gì?
- 19. Sự khác biệt giữa execl và execv là gì?
- 20. Sự khác biệt giữa Trình duyệt và Nút là gì?
- 21. Sự khác biệt giữa HTTPS và SSL
- 22. Sự khác biệt giữa yếu và không an toàn_unretained
- 23. Sự khác biệt giữa dispatch_get_global_queue và dispatch_queue_create là gì?
- 24. Sự khác biệt giữa "Thread.currentThread(). GetName" và "this.getName" là gì?
- 25. Sự khác biệt giữa tệp .so và .lo là gì?
- 26. sự khác biệt giữa WAS và IIS là gì?
- 27. Sự khác biệt giữa is_a và instanceof là gì?
- 28. HttpPost to ReturnURL sau khi chuyển hướng
- 29. Sự khác biệt giữa struct_time và datetime là gì?
- 30. Sự khác biệt giữa instanceof và Class.isAssignableFrom (...) là gì?
Câu trả lời hay! +1 – whiskeysierra