2010-03-31 54 views
43

Tôi đang thiết kế API RESTful nơi một số cuộc gọi được công khai qua HTTP và một số yêu cầu khóa API và mã hóa qua HTTPS. Tôi đang cân nhắc về mã phản hồi nào sẽ được gửi nếu yêu cầu HTTP được gửi đến một trong các tài nguyên riêng tư. Cho đến nay người duy nhất nhảy ra ngoài với tôi là 412 - Điều kiện tiên quyết không thành công, nhưng tiêu chuẩn chỉ ra rằng điều kiện tiên quyết được áp đặt bởi người yêu cầu chứ không phải máy chủ.Phản hồi HTTP thích hợp để gửi yêu cầu yêu cầu SSL/TLS

Có mã phản hồi thích hợp cho điều kiện này không hay tôi chỉ cần cung cấp cho và làm ?

Trả lời

5

Cách an toàn nhất để buộc HTTP client để sử dụng HTTPS là HTTP Strict Transport Security.

Trước đây, một đề xuất phổ biến là xóa kết nối, nhưng điều này là practice has been removed in favor of HSTS (trang web OWASP).

+0

Cảm ơn bạn đã cập nhật. – gtd

+6

1. Dự thảo HSTS đã được chuyển sang IETF (http://tools.ietf.org/id/draft-ietf-websec-strict-transport-sec). 2. đọc nó không thực sự đưa ra một câu trả lời tốt cho câu hỏi của OP. –

+1

HSTS thực thi HTTPS trên toàn bộ trang web. Các poster ở trên muốn một số tài nguyên có sẵn trên HTTP trong khi những người khác chỉ qua HTTPS. Vì vậy, HSTS không thể được sử dụng vì nó áp dụng cho tất cả các tài nguyên. – Fred

5

Mã lỗi thích hợp để trả về sẽ tương tự như 403.4 - SSL required.

Mặc dù không được minh chứng một cách rõ ràng trong RFC for HTTP 1.1, hành vi này không phù hợp với các yêu cầu nêu ở đó:

Máy chủ hiểu yêu cầu, nhưng từ chối đáp ứng nó. Ủy quyền sẽ không giúp và yêu cầu KHÔNG được lặp lại. Nếu phương thức yêu cầu không phải là HEAD và máy chủ muốn công khai vì sao yêu cầu chưa được thực hiện, nó NÊN mô tả lý do từ chối trong thực thể. Nếu máy chủ không muốn cung cấp thông tin này cho khách hàng, bạn có thể sử dụng mã trạng thái 404 (Không tìm thấy) để thay thế.

Thêm mã con của riêng bạn (như với ví dụ SSL) có thể hữu ích trong một số trường hợp, nhưng vì mã con này sẽ không có ý nghĩa đối với bên thứ ba, tôi khuyên bạn nên chống lại nó.

Vì vậy, thông báo lỗi cuối cùng của bạn sẽ giống như "403 - Tài nguyên cá nhân". Lưu ý rằng, ngay cả trong trường hợp thiếu khóa API, "401 - Không được phép" sẽ không được sử dụng, trừ khi khóa API của bạn thực sự có thể được truyền trong trường tiêu đề WWW-Authenticate.

+4

Lưu ý rằng mã trạng thái IIS là không có thật. Mã trạng thái HTTP chỉ gồm các số (chính xác 3). Xem http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1.1 Cũng lưu ý rằng cụm từ lý do cho 403 là "Bị cấm" và điều này không thể sửa đổi. Bất kỳ lời giải thích thêm nào cũng nên đi vào phần thân * phản hồi *. –

+1

Vâng, như là hấp dẫn như là subcode là tôi không thể đằng sau bản chất không chuẩn hóa của nó. – gtd

+4

Tôi đồng ý với những người nhận xét khác rằng không nên sử dụng mã con, nhưng có thể tạo một trường hợp cho đồng bằng 403. Ví dụ: đó là những gì Twitter đang sử dụng cho API của họ. Xem https://dev.twitter.com/docs/security/using-ssl –

22

Tôi không thể nói nếu điều này được chấp nhận rộng rãi bởi các khách hàng HTTP, nhưng nói đúng RFC, máy chủ nên phản ứng với:

HTTP/1.1 426 Upgrade Required 
Upgrade: TLS/1.0, HTTP/1.1 
Connection: Upgrade 

Nguồn:
http://tools.ietf.org/html/rfc2817#section-4.2

+3

Thú vị. RFC và OWASP khác nhau trong các khuyến nghị của họ. Tôi thích phiên bản của OWASP - không trả lời yêu cầu và chỉ thả gói. Với cách tiếp cận RFC, một người ở giữa có thể chặn phản hồi (vì nó chưa phải là https) và chuyển hướng đến một trang web giả mạo. –

+0

Vâng, tôi đồng ý - đó chắc chắn là một lỗ hổng. Ngay cả khi việc ngắt kết nối có thể gây nhầm lẫn, các mối quan tâm về bảo mật sẽ được ưu tiên tại đây. Ngoài ra, lưu ý rằng RFC được đề cập hiện nay là thực tế 10 năm (trong những lần bảo mật có thể không có được một khía cạnh quan trọng như ngày hôm nay). – MicE

+0

Bạn biết đấy, sau khi nhìn kỹ hơn, tôi nhận ra điều này là để nâng cấp lên TLS, có lẽ từ một số phiên bản SSL cũ hơn. Tôi không làm TLS, vì vậy tôi không thể sử dụng tiêu đề đó, và kể từ khi spec là đặc biệt cho TLS tôi không nghĩ rằng điều này là thích hợp. Thật không may tôi cũng không có cách nào để bỏ kết nối ... – gtd

0

Chỉ cần gửi một chuyển hướng đến tương ứng https: URI.

CẬP NHẬT

là một câu trả lời sai - xem ý kiến ​​dưới đây

+1

Có rủi ro bảo mật. "Kẻ tấn công thực hiện một người đàn ông trong cuộc tấn công trung gian có thể chặn phản hồi chuyển hướng HTTP và gửi người dùng đến trang thay thế" - từ OWASP SSL Thực tiễn tốt nhất –

+1

Điều đó không ngăn người dùng vẫn tham chiếu đến url http, trên thực tế, với hầu hết khách hàng http họ thậm chí sẽ không thấy rằng một chuyển hướng http đã diễn ra. Quét các vấn đề dưới tấm thảm có lẽ không phải là cách tiếp cận bạn muốn thực hiện. –

+1

Có, xin lỗi. Các bạn nói đúng. Gửi một chuyển hướng là điều sai trái để làm. Cảm ơn bạn đã chỉ ra điều đó. –

4

Trả lại với cụm từ lý do "Yêu cầu HTTPS" có vẻ như là một tùy chọn thực tế và những gì tôi sử dụng.

thấy https://en.wikipedia.org/wiki/HTTP_403

Chuyển hướng một REST Api không phải là một ý tưởng tốt đặc biệt là khi bạn có thể không có ý tưởng như thế nào hoặc những gì được tiêu thụ dịch vụ của bạn.

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