Cổng HTTP có cụ thể không?


355

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

Câu trả lời:


329

Đặc tả cookie hiện tại là RFC 6265 , thay thế RFC 2109RFC 2965 (cả hai 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ử, cookie chứa một số lỗi không bảo mật và quyền riêng tư. Ví dụ: một máy chủ có thể chỉ ra rằng một cookie nhất định được dành 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 khi có kẻ tấn công mạng đang hoạt động. Tương tự, cookie cho một máy chủ nhất định đượ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" thông thường được sử dụng bởi các trình duyệt web tách biệt 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

Cookies không cung cấp sự cô lập bởi cổng . Nếu một dịch vụ chạy trên một cổng có thể đọc được cookie, thì cookie cũng có thể đọc được bởi một dịch vụ 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 được bởi một dịch vụ trên một cổng, thì cookie cũng có thể ghi được bởi một dịch vụ chạy trên một cổng khác của cùng một máy chủ. Vì lý do này, các 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.


129

Theo RFC2965 3.3.1 (có thể được theo dõi bởi các trình duyệt), trừ khi cổng được chỉ định rõ ràng thông qua porttham số của Set-Cookietiêu đề, cookie có thể hoặc không thể được gửi đến bất kỳ cổng nào.

Sổ tay bảo mật trình duyệt của Google cho biết: theo mặc định, phạm vi cookie được giới hạn ở tất cả cá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 chỉ với một tên DNS duy nhất [...], không có cách nào để giới hạn chúng ở một cổng cụ thể. (Ngoài ra, hãy nhớ rằng IE không chịu ảnh hưởng số cổng vào chính sách cùng nguồn gốc của nó ở tất cả .)

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


75
RFC 6265 , thay thế RFC 2965, loại bỏ Porttham số trong Set-Cookietiêu đề (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 cookie trên cùng một máy chủ không còn bị phân tán bởi các cổng nữa.
Rémy Lebeau

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

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

5
Chrome thậm chí sẽ không đặt cookie nếu tên miền có cổng.
Pim Heijden

76

Đâ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 cách giải quyết mà tôi đã sử dụng.

Tôi có hai dịch vụ chạy trên máy tính xách tay của mình (một trên cổng 3000 và dịch vụ khác trên 4000). Khi tôi sẽ nhảy giữa ( http://localhost:3000http://localhost:4000 ), Chrome sẽ chuyển qua cùng một cookie, mỗi dịch vụ sẽ không hiểu cookie và tạo một cái 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 do Chrome giữ cookie cho localhost và một 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.


1
Có, vì cookie được liên kết với tên máy chủ / tên miền, do đó, cookie localhostkhông thể được chia sẻ với 127.0.0.1và 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, đều có thể chia sẻ được.
Remy Lebeau

3
Tất nhiên họ làm. Tôi (và có 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 được thêm vào tạo ra sự khác biệt: localhost: 8080
David Balažic

53
Ngoài ra, bạn có thể sử dụng 127.0.0.1, 127.0.0.2, 127.0.0.3, v.v ... tất cả đều có nghĩa là localhost.
David Balažic

3
Tôi không thể nêu lên điều này bởi vì nó không trả lời câu hỏi nhưng đó là một mẹo hay, cảm ơn!
Martin T.

2
Nếu bạn sẵn sàng chỉnh sửa tệp máy chủ của mình (/ etc / hosts trên Unix), bạn có thể có nhiều tên có ý nghĩa như bạn muốn cho localhost.
Silas S. Brown

20

Đây là một khu vực màu xám lớn trong SOP cookie (Chính sách xuất xứ tương tự).

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 hoạt động với một số trình duyệt và bạn sẽ gặp các vấn đề khác. Vì vậy, điều này chỉ khả thi nếu các trang web của bạn không dành cho công chúng nói chung và bạn có thể kiểm soát những trình duyệt nào sẽ 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.


9
Nó không phải là một khu vực màu xám nữa. RFC 6265 , là tiêu chuẩn cookie hiện tại, loại bỏ mọi nhầm lẫn 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.
Remy Lebeau

18

Một cách khác để giải quyết vấn đề là làm cho tên của cookie phiên có liên quan đến cổng. 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 cấu hình máy chủ web để tìm ra cổng nào mà máy chủ của bạn sử dụng và đặt tên cho cookie.

Hãy nhớ rằng ứng dụng của bạn sẽ nhận được cả hai cookie và bạn cần yêu cầu cái 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ỳ tham số nào khác cụ thể cho trường hợp máy chủ bạn sử dụng, do đó, tên này có thể được giải mã theo ngữ cảnh phù hợp.


9

Trong IE 8, cookie (chỉ được xác minh đối với localhost) đượ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.


4

Tôi đã gặp một vấn đề tương tự khi 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 sau:

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

Khi tôi đã đăng nhập vào cái đầu tiên và sau đó trong cái thứ hai, tôi luôn luôn đăng xuất cái đầu tiên và ngược lại.

Tôi đã thêm cái này vào / 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 sau:

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

Vấn đề đã được giải quyết :)


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

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

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.