2011-02-05 43 views
7

Tôi muốn tạo cookie từ một miền khi người dùng được đăng ký bằng PHP. và làm cho cookie này có thể truy cập được đến 4 tên miền khác không phải tên miền phụ. Tôi biết rằng cookie không được thiết kế để có thể truy cập được đối với các miền khác. Ví dụ tôi đã đặt một biến cookie $ user_email từ miền www.firstdomain.com và muốn truy cập nó trong các tên miền khác như www.seconddomain.com, www.thirddomain.com vv Có thể điều này có thể được thực hiện bằng cách sử dụng PHP hoặc JavaScript. Bất kỳ ý tưởng xin vui lòng.Cookie PHP cho nhiều tên miền

Cảm ơn bạn!

Trả lời

6

Như bạn đã nói, bạn chỉ có thể đặt cookie cho tên miền từ tên miền đó (bao gồm tên miền phụ của tên miền đó). Và nếu tên miền của bạn không chia sẻ một tên miền siêu phổ biến, bạn cần đặt từng cookie cho mỗi tên miền riêng biệt.

Bạn có thể thực hiện việc này bằng tập lệnh trên mỗi tên miền đặt cookie cho bạn. Nhưng hãy đảm bảo xác thực các yêu cầu đối với các tập lệnh này để chỉ bạn mới có thể đặt cookie.

+0

Tôi nghĩ bài viết này giải thích khá ngắn gọn: http://www.codeguru.com/csharp/csharp/cs_internet/article.php/c19417/Sharing-Cookies-Across-Domains.htm – peteski

1

Tôi đã giải quyết chính xác cùng một vấn đề (thực sự cũng cho 4 tên miền). Giải pháp duy nhất tôi đưa ra là, bao gồm 3 iframe ẩn trên 'Trang đăng nhập thành công' và các iframe chỉ tải www.domain1.com/register_session.php, www.domain2.com/register_session.php, v.v. ...

là một tham số cho register_session.php tôi sử dụng 'sid' chứa session ID:

session_id($_GET['sid']); 
session_start(); 

Đây thực sự là để giữ cho phiên còn sống trên tất cả những lĩnh vực nhưng cùng sẽ là đối với trường hợp của bạn với cookie.

+0

Hoặc, bạn chỉ có thể thực hiện yêu cầu AJAX gốc qua [CORS] (http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross -Nguồn-chia sẻ tài nguyên /) để truyền thông tin qua các tên miền. –

9

Khi tìm kiếm danh sách cookie cho cookie hợp lệ, một sự so sánh của thuộc tính miền của cookie là thực hiện với các tên miền Internet của dẫn chương trình mà từ đó các URL sẽ vời. Nếu có kết quả phù hợp đuôi, thì cookie sẽ đi qua đường dẫn phù hợp để xem liệu nó có được gửi hay không. "Kết hợp đuôi" có nghĩa là thuộc tính miền được đối sánh với đuôi của tên miền đủ điều kiện là máy chủ lưu trữ. Thuộc tính miền của "acme.com" sẽ khớp với tên máy chủ "anvil.acme.com" cũng như "shipping.crate.acme.com". Chỉ các máy chủ trong miền được chỉ định mới có thể đặt một cookie cho tên miền và tên miền phải có ít nhất hai (2) hoặc ba (3) khoảng thời gian trong chúng để ngăn các miền của biểu mẫu: ".com", ". edu ", và" va.us ". Bất kỳ miền nào bị lỗi trong một trong số bảy tên miền cấp cao nhất đặc biệt được liệt kê bên dưới chỉ yêu cầu hai khoảng thời gian. Bất kỳ tên miền nào khác yêu cầu ít nhất ba. Bảy tên miền cấp cao nhất đặc biệt có tên là "COM", "EDU", "NET", "ORG", "GOV", "MIL" và "INT".

Giá trị mặc định của tên miền là tên máy chủ của máy chủ được tạo phản hồi cookie.

đọc lên here.

bạn có thể tải iframe từ máy chủ lưu trữ, sau đó tải lại chính nó với giá trị cookie được mã hóa trong phần phân đoạn (sau #).

bạn có thể truy cập thuộc tính document.location từ cửa sổ chính (truy cập vào thứ duy nhất có thể truy cập được). giải mã nó và chuyển nó đến máy chủ của bạn thực hiện một yêu cầu ajax.

Điều này có thể trông giống như vậy.

xss.php (nằm trên cookie.example.com):

<?php 
$data = array(
'uid' => $_COOKIE['uid'], 
'loginhash' => $_COOKIE['loginhash']); 
header('Location: xss.php#'.urlencode(json_encode($data))); 

cho trường hợp cụ thể này, không cần phải là thẻ bắt đầu bằng #! nó chỉ thuận lợi cho các tình huống khác. điều này cũng có thể được thực hiện trong javascript.

một trang web khác nhúng xss.php:

<iframe id="cookies" src="http://cookies.example.com/xss.php"></iframe> 

you need to somehow delay the following of do it in a loop that stops after 5 seconds or something. 

if(document.getElementById('cookies').location != 'http://cookies.example.com/xss.php') { 
// read location, extract hashtag, json decode using javscript, there you have your user. send it to server for validation or whatever. 
} 

teqnique này được gọi là XSS recieving. nó được ví dụ sử dụng bởi facebook cho tất cả các thư viện kết nối javascript của họ.

một cách tốt hơn có thể là một số loại giao thức trao đổi mã thông báo như openid.

amazon cũng sử dụng điều này.

bạn có thể thiết lập nhà cung cấp dịch vụ mở (có sẵn thư viện có thể thực hiện điều đó ngoài hộp) và đặt để chuyển hướng auotmatically trở lại mà không cần tương tác của người dùng. tôi thường thấy giao thức openid được sử dụng cho một số mục đích khác giống như giao tiếp tên miền chéo.

+0

Bạn có thể chỉnh sửa câu trả lời của mình (có thể cung cấp một đoạn mã mẫu) để tôi có thể giới thiệu lại cho bạn không? Tôi vô tình xóa bỏ ý kiến ​​của mình. –

+0

sắp xuất hiện. –

+0

tôi nghĩ rằng nó có thể được thực hiện một cách thanh lịch hơn nhưng nguyên tắc vẫn giữ nguyên –

1

tôi đã thực hiện một số kịch bản để xử lý tên miền cookie đa:

https://code.google.com/p/mudoco/

+0

Rất tuyệt, Hãy cho nó một vòng xoáy sau này, ném nó lên GitHub và tôi sẽ đóng góp –

0

nếu bạn muốn truy cập cookie trong lĩnh vực khác nhau vì vậy đây có thể được thực hiện với sự giúp đỡ của lừa javascript. Vì cookie có thể được truy cập trong cùng một tên miền.

  1. Tạo cookie trên trình duyệt của người dùng bằng JavaScript trên tên miền đầu tiên của bạn.

  2. Đặt tên cửa sổ thành bất kỳ giá trị cookie nào bạn muốn chuyển sang tên miền khác bằng cách sử dụng window.name.

  3. Bước 2 phải được thực hiện trên mọi trang của tên miền đã tạo cookie. Nó có thể dễ dàng bằng cách gọi một tập tin JavaScript trên tất cả các trang.

  4. Khi bạn chuyển sang miền khác và muốn truy cập giá trị cookie được đề cập ở trên, hãy truy cập vào giá trị đó bằng cách sử dụng window.name làm window chưa thay đổi.

  5. Tạo cookie mới trên tên miền này và chỉ định giá trị này cho tên miền đó.

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