2009-10-23 37 views
250

Tôi có hai dịch vụ HTTP chạy trên một máy. Tôi chỉ muốn biết liệu họ có chia sẻ cookie của họ hoặc liệu trình duyệt có phân biệt giữa hai socket máy chủ hay không.Cổng cookie HTTP có cụ thể không?

Trả lời

206

Đặc tả cookie hiện tại là RFC 6265, thay thế RFC 2109RFC 2965 (cả RFC hiện được đánh dấu là "Lịch sử") và chính thức hóa cú pháp cho việc sử dụng cookie trong thế giới thực. Nó nêu rõ:

  1. Giới thiệu

...

Vì lý do lịch sử, cookies chứa một số infelicities an ninh và sự riêng tư. Ví dụ, một máy chủ có thể chỉ ra rằng một cookie nhất định được thiết kế cho các kết nối "an toàn", nhưng thuộc tính Secure không cung cấp tính toàn vẹn trong sự hiện diện của kẻ tấn công mạng đang hoạt động. Tương tự, cookie cho một máy chủ được chia sẻ trên tất cả các cổng trên máy chủ đó, mặc dù chính sách "cùng nguồn gốc" được sử dụng bởi trình duyệt web phân tách nội dung được truy xuất qua các cổng khác nhau.

Và cũng:

8,5. Bảo mật yếu

Cookie không cung cấp cách ly bằng cổng. Nếu một cookie có thể đọc được bởi một dịch vụ đang chạy trên một cổng, cookie cũng có thể đọc được bởi một dịch vụ đang chạy trên một cổng khác của cùng một máy chủ. Nếu một cookie có thể ghi bởi một dịch vụ trên một cổng, cookie cũng có thể ghi bởi một dịch vụ đang chạy trên một cổng khác của cùng một máy chủ. Vì lý do này, máy chủ KHÔNG NÊN chạy cả hai dịch vụ không tin tưởng lẫn nhau trên các cổng khác nhau của cùng một máy chủ và sử dụng cookie để lưu trữ thông tin nhạy cảm về bảo mật.

1

Đó là tùy chọn.

Cổng có thể được chỉ định để cookie có thể là cổng cụ thể. Nó không cần thiết, máy chủ web/ứng dụng phải quan tâm đến điều này.

Nguồn: German Wikipedia article, RFC2109 Chương 4.3.1

+2

[Âm thanh như nó phức tạp hơn điều này trong đời thực.] (http://stackoverflow.com/questions/1612177/are-http-cookies-port-specific/4212964#4212964) – bzlm

18

Đây là một vùng màu xám lớn trong cookie SOP (Same xứ Policy).

Về mặt lý thuyết, bạn có thể chỉ định số cổng trong miền và cookie sẽ không được chia sẻ. Trong thực tế, điều này không làm việc với một số trình duyệt và bạn sẽ chạy vào các vấn đề khác. Vì vậy, điều này chỉ khả thi nếu trang web của bạn không dành cho công chúng và bạn có thể kiểm soát những trình duyệt nào để sử dụng.

Cách tiếp cận tốt hơn là lấy 2 tên miền cho cùng một IP và không dựa vào số cổng cho cookie.

+7

Nó không phải là màu xám khu vực nữa. [RFC 6265] (http://tools.ietf.org/html/rfc6265), là tiêu chuẩn cookie hiện tại, loại bỏ bất kỳ sự nhầm lẫn nào về nó bằng cách loại bỏ khả năng tách cookie trên cùng một máy chủ bằng các cổng khác nhau. –

112

Theo RFC2965 3.3.1 (mà có thể hoặc không thể được theo sau bởi các trình duyệt), trừ khi cảng được quy định một cách rõ ràng thông qua port tham số của Set-Cookie header, cookie có thể hoặc có thể không được gửi đến bất kỳ cảng.

Google Browser Security Handbook nói: theo mặc định, phạm vi cookie được giới hạn cho tất cả URL trên tên máy chủ hiện tại - và không bị ràng buộc với thông tin cổng hoặc giao thức. và một số dòng sau Không có cách nào để giới hạn cookie cho một tên DNS duy nhất [...] tương tự như vậy, không có cách nào giới hạn chúng vào một cổng cụ thể. (Ngoài ra, xin lưu ý rằng IE không đưa các số cổng vào chính sách cùng nguồn gốc tại tất cả.)

Vì vậy dường như không an toàn để dựa vào bất kỳ hành vi nào được xác định rõ ở đây.

+51

[RFC 6265] (http://tools.ietf.org/html/rfc6265), thay thế RFC 2965, loại bỏ tham số 'Port' trong tiêu đề' Set-Cookie' (vì hầu như không ai thực sự sử dụng nó trong thực tế) , và làm cho nó rất rõ ràng rằng các tập tin cookie trên cùng một máy chủ KHÔNG bị trục trặc bởi các cảng nữa. –

+4

IE 9 thậm chí sẽ không gửi lại cookie về các yêu cầu tiếp theo nếu miền có cổng trong đó – axk

+2

Có trình duyệt nào vẫn đang xem xét cổng trong SOP của cookie không? – Bertuz

14

Một cách khác để khắc phục sự cố, là đặt tên cho cookie phiên là cổng có liên quan. Ví dụ:

  • mysession8080 cho máy chủ chạy trên cổng 8080
  • mysession8000 cho máy chủ chạy trên cổng 8000

Mã của bạn có thể truy cập vào cấu hình máy chủ web để tìm ra cổng máy chủ của bạn sử dụng và đặt tên cho cookie tương ứng.

Hãy nhớ rằng ứng dụng của bạn sẽ nhận được cả hai cookie và bạn cần phải yêu cầu ứng dụng tương ứng với cổng của bạn.

Không cần phải có số cổng chính xác trong tên cookie, nhưng điều này thuận tiện hơn.

Nói chung, tên cookie có thể mã hóa bất kỳ thông số nào khác cụ thể cho cá thể máy chủ bạn sử dụng, do đó nó có thể được giải mã bằng ngữ cảnh phù hợp.

9

Trong IE 8, cookie (chỉ được xác minh đối với máy chủ cục bộ) được chia sẻ giữa các cổng. Trong FF 10, họ không.

Tôi đã đăng câu trả lời này để người đọc sẽ có ít nhất một tùy chọn cụ thể để kiểm tra từng kịch bản.

42

Đây là một câu hỏi thực sự cũ nhưng tôi nghĩ rằng tôi sẽ thêm một workaround tôi sử dụng.

Tôi có hai dịch vụ đang chạy trên máy tính xách tay của mình (một trên cổng 3000 và cổng còn lại trên 4000). Khi tôi chuyển qua lại giữa (http://localhost:3000http://localhost:4000), Chrome sẽ chuyển vào cùng một cookie, mỗi dịch vụ sẽ không hiểu cookie và tạo một cookie mới.

Tôi thấy rằng nếu tôi truy cập http://localhost:3000http://127.0.0.1:4000, sự cố đã biến mất kể từ khi Chrome lưu cookie cho máy chủ cục bộ và một cookie cho 127.0.0.1.

Một lần nữa, không ai có thể quan tâm vào thời điểm này nhưng nó rất dễ dàng và hữu ích cho tình huống của tôi.

+0

Có, vì cookie được liên kết với tên máy chủ/tên miền nên cookie trên 'localhost' không thể được chia sẻ với' 127.0.0.1' và ngược lại. Nhưng cookie trên cùng một máy chủ/tên miền, bất kể cổng, có thể chia sẻ được không. –

+0

Điều này có thể chỉ hoạt động trong Chrome, vì hầu hết các trình duyệt khác không gửi cookie đến "localhost" (= một chuỗi không có hai chấm) – Max

+3

Tất nhiên là có. Tôi (và có thể là hàng triệu nhà phát triển khác) sử dụng localhost để kiểm tra mọi lúc. Trừ khi cổng bổ sung tạo sự khác biệt: http: // localhost: 8080/ –

2

Tôi đã gặp sự cố tương tự đang chạy (và cố gắng gỡ lỗi) hai ứng dụng Django khác nhau trên cùng một máy.

Tôi đã chạy chúng với các lệnh:

./manage.py runserver 8000 
./manage.py runserver 8001 

Khi tôi đã đăng nhập trong một đầu tiên và sau đó trong một giây tôi luôn luôn bị đăng xuất khỏi người đầu tiên và ngược lại.

tôi thêm này tôi /etc/hosts

127.0.0.1 app1 
127.0.0.1 app2 

Sau đó, tôi bắt đầu hai ứng dụng với các lệnh:

./manage.py runserver app1:8000 
./manage.py runserver app2:8001 

vấn đề giải quyết :)

+3

bạn có thể sử dụng '127.0.0.1: 8000' cho một,' localhost: 8000' cho một giây, và có thể là ':: 1: 8000' (có thể là' [:: 1]: 8080') cho một phần ba mà không bao giờ phải chạm vào tệp máy chủ. – Travis

+0

bạn có thể đặt nó vào một dòng: '' ':: 1 app1 app2 app3 app4 app5 appN''' – aeroson

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