Chuỗi truy vấn HTTPS có an toàn không?


351

Tôi đang tạo một API dựa trên web an toàn sử dụng HTTPS; tuy nhiên, nếu tôi cho phép người dùng định cấu hình nó (bao gồm gửi mật khẩu) bằng chuỗi truy vấn thì điều này cũng sẽ được bảo mật hay tôi có nên buộc nó được thực hiện thông qua POST không?

Câu trả lời:


453

Vâng, đúng vậy. Nhưng sử dụng GET cho dữ liệu nhạy cảm là một ý tưởng tồi vì nhiều lý do:

  • Chủ yếu là rò rỉ tham chiếu HTTP (một hình ảnh bên ngoài trong trang đích có thể rò rỉ mật khẩu [1])
  • Mật khẩu sẽ được lưu trong nhật ký máy chủ (rõ ràng là xấu)
  • Bộ nhớ cache lịch sử trong trình duyệt

Do đó, ngay cả khi Chuỗi truy vấn được bảo mật, không nên chuyển dữ liệu nhạy cảm qua chuỗi truy vấn.

[1] Mặc dù tôi cần lưu ý rằng RFC nói rằng trình duyệt không nên gửi người giới thiệu từ HTTPS đến HTTP. Nhưng điều đó không có nghĩa là thanh công cụ trình duyệt bên thứ 3 xấu hoặc hình ảnh / đèn flash bên ngoài từ trang web HTTPS sẽ không làm rò rỉ nó.


4
Còn người giới thiệu https đến https thì sao? Nếu tôi nhận được hình ảnh từ trang web của bên thứ 3 bằng https? Trình duyệt có gửi toàn bộ chuỗi truy vấn từ yêu cầu trước của tôi đến máy chủ của bên thứ 3 không?
Jus12

4
@ Jus12 đúng vậy, nó sẽ không có ý nghĩa gì nhưng đó là cách nó được thiết kế.
dr. ác

2
Vậy thì tại sao đặc tả OAuth2 không khuyến nghị gửi dữ liệu nhạy cảm trong các tham số truy vấn (trong URL)? Mặc dù bạn nên sử dụng TLS (HTTPS) luôn. Tham khảo điểm cuối cùng trong tools.ietf.org/html/draft-ietf-oauth-v2-bearer-16#section-4.3 CC @volka
gihanchanuka

@ dr.evil Bạn có thể vui lòng giải thích vấn đề với History caches in browsershoặc thêm một số tài liệu tham khảo cho ir?
LCJ

1
Để hoàn thành câu trả lời đó với thông tin cập nhật: securitynewspaper.com/2016/08/01/ ((Proxy PAC hack cho phép chặn URL HTTPS)
Tom

78

Từ quan điểm "đánh hơi gói mạng", yêu cầu GET là an toàn, vì trước tiên trình duyệt sẽ thiết lập kết nối an toàn và sau đó gửi yêu cầu có chứa các tham số GET. Nhưng url của GET sẽ được lưu trữ trong lịch sử / tự động hoàn thành của trình duyệt, đây không phải là nơi tốt để lưu trữ, ví dụ như dữ liệu mật khẩu. Tất nhiên điều này chỉ áp dụng nếu bạn sử dụng định nghĩa "Dịch vụ web" rộng hơn có thể truy cập dịch vụ từ trình duyệt, nếu bạn chỉ truy cập nó từ ứng dụng tùy chỉnh thì đây không phải là vấn đề.

Vì vậy, sử dụng bài viết ít nhất cho các hộp thoại mật khẩu nên được ưu tiên. Cũng như được chỉ ra trong liên kết littlegeek đã đăng một URL GET có nhiều khả năng được ghi vào nhật ký máy chủ của bạn.


48

, chuỗi truy vấn của bạn sẽ được mã hóa.

Lý do đằng sau là các chuỗi truy vấn là một phần của giao thức HTTP, là giao thức của lớp ứng dụng, trong khi phần bảo mật (SSL / TLS) đến từ lớp vận chuyển. Kết nối SSL được thiết lập trước và sau đó các tham số truy vấn (thuộc giao thức HTTP) được gửi đến máy chủ.

Khi thiết lập kết nối SSL, khách hàng của bạn sẽ thực hiện các bước sau theo thứ tự. Giả sử bạn đang cố gắng đăng nhập vào một trang web có tên example.com và muốn gửi thông tin đăng nhập của bạn bằng các tham số truy vấn. URL hoàn chỉnh của bạn có thể trông giống như sau:

https://example.com/login?username=alice&password=12345)
  1. Ứng dụng khách của bạn (ví dụ: trình duyệt / ứng dụng di động) trước tiên sẽ phân giải tên miền của bạn example.comthành địa chỉ IP (124.21.12.31)bằng yêu cầu DNS. Khi truy vấn thông tin đó, chỉ có thông tin cụ thể của miền được sử dụng, tức là chỉ example.comđược sử dụng.
  2. Bây giờ, khách hàng của bạn sẽ cố gắng kết nối với máy chủ bằng địa chỉ IP 124.21.12.31và sẽ cố gắng kết nối với cổng 443 (cổng dịch vụ SSL không phải là cổng HTTP mặc định 80).
  3. Bây giờ, máy chủ example.comsẽ gửi chứng chỉ cho khách hàng của bạn.
  4. Khách hàng của bạn sẽ xác minh các chứng chỉ và bắt đầu trao đổi khóa bí mật chung cho phiên của bạn.
  5. Sau khi thiết lập thành công kết nối an toàn, chỉ sau đó các tham số truy vấn của bạn sẽ được gửi qua kết nối an toàn.

Do đó, bạn sẽ không để lộ dữ liệu nhạy cảm. Tuy nhiên, gửi thông tin đăng nhập của bạn qua phiên HTTPS bằng phương pháp này không phải là cách tốt nhất. Bạn nên đi cho một cách tiếp cận khác.


2
Nhưng hãy xem câu trả lời của @dr. ác, chuỗi khai thác có thể kết thúc trong các tệp nhật ký và bộ đệm để nó không an toàn trên máy chủ.
zaph 28/03/2016

3
Xin chào zaph, về mặt bảo mật HTTPS, mục tiêu là gửi dữ liệu an toàn đến máy chủ mà không có ai ở giữa có thể phát hiện ra dữ liệu. Trong khi điều đó là có thể, và trả lời câu hỏi, thật khó để kiểm soát những gì máy chủ làm sau đó. Đó là lý do tại sao tôi cũng đã đề cập đây không phải là cách chính xác. Thêm vào đó, bạn không bao giờ nên gửi mật khẩu của bạn từ khách hàng. Bạn phải luôn băm nó trên thiết bị và gửi giá trị băm đến máy chủ.
Ruchira Randana

Từ quan điểm bảo mật gửi thông tin bí mật trong chuỗi khai thác không an toàn, tốt nhất là gửi nó trong POST. Ngoài ra, mật khẩu thường được băm trên máy chủ, không phải bởi máy khách. Câu lệnh "bạn không bao giờ nên gửi mật khẩu của bạn từ khách hàng" mâu thuẫn với câu trả lời : (e.g http://example.com/login?username=alice&password=12345).
zaph 28/03/2016

@RuchiraRandana băm trên máy khách là vô nghĩa vì khóa riêng sau đó dễ dàng được lấy từ giao diện người dùng.
James W

@JamesW " khóa riêng sau đó dễ dàng được lấy từ giao diện người dùng " Khóa nào?
tò mò

28

Đúng. Toàn bộ văn bản của phiên HTTPS được bảo mật bằng SSL. Điều đó bao gồm các truy vấn và các tiêu đề. Về mặt đó, POST và GET sẽ hoàn toàn giống nhau.

Về tính bảo mật của phương pháp của bạn, không có cách nào thực sự để nói mà không có sự kiểm tra thích hợp.


27
Có nhiều thứ để bảo mật hơn là chỉ liên lạc giữa trình duyệt và máy chủ
JoeBloggs

26

SSL trước tiên kết nối với máy chủ, vì vậy tên máy chủ và số cổng được chuyển dưới dạng văn bản rõ ràng. Khi máy chủ phản hồi và thử thách thành công, máy khách sẽ mã hóa yêu cầu HTTP bằng URL thực tế (tức là bất cứ điều gì sau dấu gạch chéo thứ ba) và gửi nó đến máy chủ.

Có một số cách để phá vỡ bảo mật này.

Có thể định cấu hình proxy để hoạt động như một "người đàn ông ở giữa". Về cơ bản, trình duyệt gửi yêu cầu kết nối với máy chủ thực tới proxy. Nếu proxy được cấu hình theo cách này, nó sẽ kết nối qua SSL với máy chủ thực nhưng trình duyệt vẫn sẽ nói chuyện với proxy. Vì vậy, nếu kẻ tấn công có thể có quyền truy cập proxy, anh ta có thể thấy tất cả dữ liệu chảy qua nó trong văn bản rõ ràng.

Yêu cầu của bạn cũng sẽ được hiển thị trong lịch sử trình duyệt. Người dùng có thể bị cám dỗ để đánh dấu trang web. Một số người dùng đã cài đặt công cụ đồng bộ hóa dấu trang, vì vậy mật khẩu có thể kết thúc trên deli.ci.us hoặc một số nơi khác.

Cuối cùng, ai đó có thể đã hack máy tính của bạn và cài đặt bộ ghi bàn phím hoặc trình quét màn hình (và rất nhiều loại virus Trojan Horse làm). Vì mật khẩu được hiển thị trực tiếp trên màn hình (trái ngược với "*" trong hộp thoại mật khẩu), đây là một lỗ hổng bảo mật khác.

Kết luận: Khi nói đến an ninh, luôn luôn dựa vào con đường bị đánh đập. Có quá nhiều thứ mà bạn không biết, sẽ không nghĩ đến và nó sẽ làm gãy cổ bạn.


3
"Trình duyệt vẫn sẽ nói chuyện với proxy" không hoàn toàn đúng, nó sẽ cần xuất trình trình duyệt với một chứng chỉ hợp lệ mà proxy chỉ có thể tạo nếu nó có quyền kiểm soát CA mà trình duyệt tin tưởng.
Pieter

11

Có, miễn là không ai nhìn qua vai bạn trên màn hình.


13
và trình duyệt của bạn không lưu lịch sử :)
Rahul Prasad

10

Tôi không đồng ý với tuyên bố về [...] Rò rỉ giới thiệu HTTP (hình ảnh bên ngoài trong trang đích có thể bị rò rỉ mật khẩu) trong phản hồi của Slough .

RFC HTTP 1.1 tuyên bố rõ ràng :

Khách hàng KHÔNG NÊN bao gồm trường tiêu đề Người giới thiệu trong yêu cầu HTTP (không bảo mật) nếu trang giới thiệu được chuyển với giao thức bảo mật.

Dù sao, nhật ký máy chủ và lịch sử trình duyệt là quá nhiều lý do để không đưa dữ liệu nhạy cảm vào chuỗi truy vấn.


2
Có từ 'nên' một lần nữa. Bạn có tin tưởng mọi phiên bản của mọi trình duyệt với mật khẩu của mình không?
JoeBloggs

1
Làm thế nào chính xác điều này có liên quan đến GET vs POST? "Mọi phiên bản của mọi trình duyệt" có an toàn không nếu bạn đang sử dụng POST qua HTTPS?
Arnout

2
Ngoài ra, trang web HTTPS có thể đang truy xuất hình ảnh bên ngoài qua HTTPS - trong trường hợp đó, trình duyệt NÊN bao gồm tiêu đề người giới thiệu và do đó lộ mật khẩu của bạn ...
AviD

3
@Arnout: Vui lòng đọc RFC này cho bạn biết ý nghĩa của NÊN: ietf.org/rfc/rfc2119.txt Nó không giống như PHẢI KHÔNG, vì vậy phần bạn trích dẫn không thực sự phù hợp và các tác nhân trình duyệt vẫn có thể bao gồm một người giới thiệu đến HTTP.
Andy

8

Có, kể từ thời điểm bạn thiết lập kết nối HTTPS, mọi thứ đều an toàn. Chuỗi truy vấn (GET) là POST được gửi qua SSL.


-4

Bạn có thể gửi mật khẩu dưới dạng MD5 hash param với một chút muối được thêm vào. So sánh nó ở phía máy chủ cho auth.


11
MD5 không phải là hàm băm thích hợp cho mật khẩu.
slawek

1
Cho dù được băm hoặc trong văn bản rõ ràng, việc gửi mật khẩu trong các tham số GET là một thực tế xấu. Vui lòng tham khảo câu trả lời bình chọn hàng đầu để giải thích. Aaaand ... MD5 không nên được sử dụng ở bất cứ đâu nữa ...
Thomas

" Hàm băm không phù hợp cho mật khẩu " Vẫn tốt hơn gửi mật khẩu trong văn bản rõ ràng đến máy chủ, lol
tò mò
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.