Dữ liệu GET cũng được mã hóa trong HTTPS?


Câu trả lời:


145

Toàn bộ yêu cầu được mã hóa, bao gồm URL và thậm chí cả lệnh ( GET). Điều duy nhất mà một bên can thiệp như máy chủ proxy có thể lượm lặt được là địa chỉ đích và cổng.

Tuy nhiên, lưu ý rằng gói Client Hello của bắt tay TLS có thể quảng cáo tên miền đủ điều kiện trong bản rõ thông qua tiện ích mở rộng SNI (cảm ơn @hafichuk), được sử dụng bởi tất cả các trình duyệt chính hiện đại, mặc dù một số chỉ trên các HĐH mới hơn.

EDIT: (Vì điều này chỉ mang lại cho tôi huy hiệu "Câu trả lời tốt", tôi đoán tôi nên trả lời toàn bộ câu hỏi.

Toàn bộ phản hồi cũng được mã hóa; proxy không thể chặn bất kỳ phần nào của nó.

Google phục vụ các tìm kiếm và nội dung khác qua https vì không phải tất cả đều là công khai và bạn cũng có thể muốn ẩn một số nội dung công khai khỏi MITM . Trong mọi trường hợp, tốt nhất là để Google tự trả lời .


2
Tôi hơi không hài lòng về tuyên bố rằng URL được mã hóa. Không phải tên máy chủ được coi là một phần của url? Nếu vậy, tuyên bố là sai. Không có cách nào để ẩn địa chỉ tên máy chủ / IP khỏi máy chủ ISP / proxy giống như cách bạn không thể ẩn địa chỉ đích trong khi gửi thư thực.
Abhishek Anand

1
@Abhishek: Tên máy chủ không có trong tiêu đề TCP / IP. Tôi bao gồm các địa chỉ IP trong câu trả lời của tôi.
Marcelo Cantos

Tên miền không được mã hóa. Điều này là để hỗ trợ các máy chủ ảo dựa trên tên (so với dựa trên IP). @MarceloCantos hoàn toàn chính xác rằng phần còn lại của URL (tức là GETlệnh) được mã hóa. Điều này được đề cập trong RFC 4366
hafichuk

@hafichuk: Cảm ơn vì điều đó. Tôi đã không nhận ra TLS có thể quảng cáo fqdn. Lần cuối cùng tôi cố gắng thiết lập một máy đa năng https (vài năm trước, tôi sẽ thừa nhận), dường như không thể qua một ip.
Marcelo Cantos

Bổ sung thực sự quan trọng vào TLS có chứa tên miền: Đừng quên yêu cầu DNS bản rõ cũng bao gồm tên miền. Có thể ai đó có thể thấy lưu lượng HTTPS được mã hóa của bạn cũng có thể xem các yêu cầu DNS của bạn.
Tim G

63

Bản thân URL được mã hóa, vì vậy các tham số trong chuỗi truy vấn không di chuyển đơn giản trên toàn bộ dây.

Tuy nhiên, hãy nhớ rằng các URL bao gồm dữ liệu GET thường được máy chủ web ghi lại, trong khi dữ liệu POST hiếm khi được. Vì vậy, nếu bạn đang dự định làm một cái gì đó như thế /login/?username=john&password=doe, thì đừng; sử dụng POST thay thế.


2
+1 cảm ơn. Đây là trên máy chủ vật lý của riêng tôi, vì vậy tôi không quá lo lắng về nhật ký, nhưng đó là một sự cân nhắc tốt cho bất cứ ai xem xét điều này trong một môi trường lưu trữ được chia sẻ. Điều này cũng quan trọng để xem xét bởi vì tôi sẽ chuyển số thẻ tín dụng theo cách này và chắc chắn sẽ không muốn đăng nhập chúng :)
orokusaki

3
Nó không thực sự quan trọng rằng đó là hộp của riêng bạn. Bạn cũng không muốn bất kỳ ai khác sở hữu nó (tức là tin tặc xấu xa) nhìn thấy những mật khẩu đó trong văn bản đơn giản. Hoặc những số CC đó (giả sử rằng bạn cũng không lưu trữ những số đó ở nơi khác).
Thomas

1
Bạn nên đặt chúng trong phần thân POST, không phải chuỗi truy vấn URL.
Thomas

1
Bạn có sợ rằng wbeserver có ít hạn chế hơn đối với quyền truy cập vào nhật ký của nó so với quyền truy cập vào dữ liệu của trang web (DB, tệp, v.v.) không? IMHO miễn là dữ liệu truy cập an toàn vào máy chủ web, tất cả đều ổn. những người duy nhất có quyền truy cập vào máy chủ web nên được coi là đáng tin cậy bởi vì nếu không có cách nào bạn sẽ ngăn họ đọc dữ liệu theo cách này hay cách khác.
Serge Profafilecebook 9/2/2015

1
Khi mật khẩu được gửi qua GET và chúng được ghi vào nhật ký truy cập, chúng KHÔNG được băm. Tôi tin rằng đó là vấn đề lớn nhất. Có mật khẩu băm trong cơ sở dữ liệu không thành vấn đề nếu bạn chỉ có thể tra cứu chúng trong nhật ký truy cập của máy chủ web. Chúng nên được băm trong cơ sở dữ liệu, nếu không, vui lòng sửa nó.
Steen Schütt

21

HTTPS Thiết lập một cấu trúc SSL cơ bản trước khi bất kỳ dữ liệu HTTP nào được truyền. Điều này đảm bảo rằng tất cả dữ liệu URL (ngoại trừ tên máy chủ, được sử dụng để thiết lập kết nối) chỉ được mang trong kết nối được mã hóa này và được bảo vệ khỏi các cuộc tấn công trung gian giống như bất kỳ dữ liệu HTTPS nào.

Trên đây là một phần của câu trả lời RẤT toàn diện từ Câu trả lời của Google có tại đây:

http://answers.google.com/answers/threadview/id/758002.html#answer



6

Mọi thứ đều được mã hóa, nhưng bạn cần nhớ rằng, truy vấn của bạn sẽ nằm trong nhật ký của máy chủ và sẽ có thể truy cập được với các máy phân tích nhật ký khác nhau, v.v. (thường không phải là trường hợp có yêu cầu POST).


1
máy chủ nào? có thể truy cập cho ai?
Jader Dias

2
@Jader để quản trị viên của máy chủ đó ít nhất và cho tin tặc. Với POST yêu cầu, thông tin không nằm trong nhật ký, trừ khi nó được ghi lại rõ ràng, không có vấn đề gì với nhật ký. Truy vấn GET vẫn ở trong nhật ký và nếu có bất cứ điều gì xảy ra với nhật ký (hoặc quản trị viên quyết định sử dụng các nhật ký này cho bất kỳ hoạt động xấu nào), bạn sẽ gặp rắc rối.
Cuộc gọi lại của Eugene Mayevski

4

Kết nối được mã hóa trước khi yêu cầu được truyền đi. Vì vậy, có, yêu cầu cũng được mã hóa, bao gồm cả chuỗi truy vấn.


4

Vâng, nó an toàn. SSL mã hóa mọi thứ.

Trích từ yêu cầu POST:

POST /foo HTTP/1.1
... some other headers

Trích từ yêu cầu GET:

GET /foo?a=b HTTP/1.1
... some other headers

Trong cả hai trường hợp, bất cứ điều gì được gửi trên ổ cắm đều được mã hóa. Việc khách hàng nhìn thấy các tham số trong trình duyệt của mình trong yêu cầu GET không có nghĩa là một người đàn ông ở giữa sẽ nhìn thấy điều tương tự.


4

Tôi vừa kết nối qua HTTPS đến một trang web và thông qua một loạt các tham số GET. Sau đó tôi đã sử dụng wireshark để đánh hơi mạng. Sử dụng HTTP, URL được gửi không được mã hóa, điều đó có nghĩa là tôi có thể dễ dàng thấy tất cả các tham số GET trong URL. Sử dụng HTTPS, mọi thứ đều được mã hóa và tôi thậm chí không thể thấy gói nào là lệnh GET, chứ đừng nói đến nội dung của nó!


3

SSL diễn ra trước khi phân tích cú pháp tiêu đề, điều này có nghĩa là:

Client creates Request
Request gets encrypted
Encrypted request gets transmitted to the Server
Server decrypts the Request
Request gets parsed

Yêu cầu trông giống như thế này (không thể nhớ cú pháp chính xác, nhưng điều này phải đủ gần):

GET /search?q=qwerty HTTP/1.1
Host: www.google.de

Đây cũng là lý do tại sao việc có Chứng chỉ SSL khác nhau cho một số máy chủ trên cùng một IP có vấn đề, Tên máy chủ được yêu cầu không được biết cho đến khi giải mã.


1
Sự HTTP/1.1xuất hiện ở cuối dòng đầu tiên.
Marcelo Cantos

@Marcelos Cantos: Cảm ơn, đã được một thời gian kể từ khi tôi phải viết Yêu cầu HTTP bằng tay.
Morfildur

0

Yêu cầu GET được mã hóa khi sử dụng HTTPS - thực tế đây là lý do tại sao các trang web được bảo mật cần phải có một địa chỉ IP duy nhất - không có cách nào để có được tên máy chủ dự định (hoặc thư mục ảo) từ yêu cầu cho đến khi được giải mã.


JFYI: Có một tiện ích mở rộng TLS cho phép khách hàng chỉ định tên máy chủ và do đó máy chủ có thể chọn chứng chỉ tương ứng.
Cuộc gọi lại của Eugene Mayevski

@Eugene: Cảm ơn - Tôi biết về tiện ích mở rộng TLS, nhưng chỉ trong ý thức lỏng lẻo nhất - Tôi không biết gì về chi tiết hoặc mức độ có thể (hoặc có thể) không được sử dụng thực tế.
Michael Burr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.