Cách đặt cookie cho tên miền khác


166

Giả sử tôi có một trang web được gọi a.comvà khi một trang cụ thể của trang web này được tải, giả sử liên kết trang, tôi muốn đặt cookie cho một trang web khác được gọi b.com, sau đó chuyển hướng người dùng đến b.com.

Ý tôi là, khi tải a.com/linktôi muốn đặt cookie b.comvà chuyển hướng người dùng đến b.com.

Tôi đã thử nghiệm nó và trình duyệt thực sự đã nhận được cookie từ đó a.com/link, nhưng nó không gửi cookie đó theo yêu cầu chuyển hướng đến b.com. Nó có bình thường không?

Chúng tôi có thể đặt cookie cho các tên miền khác không?


Xin lưu ý rằng nếu bạn sử dụng tham số URL để đặt cookie trên b.com, thì bất kỳ ai cũng có thể buộc bất kỳ giá trị cookie nào trên b.com từ bất kỳ trang web nào.
Julien

2
sử dụng iFrame của b.com để đặt cookie;)
Jaquarh

Câu trả lời:


129

Bạn không thể đặt cookie cho tên miền khác. Cho phép điều này sẽ đưa ra một lỗ hổng bảo mật rất lớn.

Bạn cần lấy b.com để đặt cookie. Nếu a.com chuyển hướng người dùng đếnb.com/setcookie.php?c=value

Tập lệnh setcookie có thể chứa các phần sau để đặt cookie và chuyển hướng đến đúng trang trên b.com

<?php
    setcookie('a', $_GET['c']);
    header("Location: b.com/landingpage.php");
?>

Tuy nhiên, a.com có ​​thể chèn cùng một dữ liệu dưới dạng tiêu đề khi chuyển hướng đến b.com, có được không? Tại sao điều này không phải là một lỗ hổng bảo mật?
Coder

3
@Coder, phiên bản setcookie sẽ dẫn đến một tiêu đề cookie được gửi đến trình duyệt từ b.com. a.com không thể gửi tiêu đề cookie từ b.com.
qbert220

vâng điều này rất không an toàn, nhưng nó hoạt động. Nếu OP sở hữu a.com và b.com và cookie khá tầm thường, thì có lẽ nó vẫn ổn.
rocketsarefast

1
tốt hơn hết là thông báo trong câu trả lời rằng điều này không an toàn mặc dù nó hoạt động.
Roy Ling

2
Làm thế nào bạn có thể nói điều này tuy nhiên youtube đang đọc cookie được tạo bởi gmail để hiển thị tài khoản của họ trên youtube?
TAHA SULTAN TEMURI

55

Tương tự như câu trả lời hàng đầu, nhưng thay vì chuyển hướng đến trang và quay lại, điều này sẽ gây ra trải nghiệm người dùng xấu, bạn có thể đặt hình ảnh trên miền A.

<img src="http://www.example.com/cookie.php?val=123" style="display:none;">

Và sau đó, trên miền B đó là example.com trong cookie.php, bạn sẽ có đoạn mã sau:

<?php
    setcookie('a', $_GET['val']);
?>

Hattip để Subin


1
hack đẹp ... :)
sotn

16
Coi chừng đó có lẽ là một ý tưởng rất tồi. Bạn đang phá vỡ sự bảo vệ cookie rất có chủ ý bằng cách cơ bản cho phép bất cứ ai gửi yêu cầu GET được tạo thủ công để đặt cookie đó thành bất kỳ giá trị nào họ muốn. Tôi không biết bạn sau đó làm gì với cookie đó, nhưng tôi hy vọng nó không liên quan đến số dư ngân hàng.
Scott Stafford

Tôi có thể đảm bảo với bạn rằng nó không liên quan đến số dư ngân hàng. Nhưng điểm tốt :)
Jonathan

2
Nếu như trong trường hợp này, mọi người đều có thể gọi tên miền này bằng tham số riêng của mình, bạn có thể thêm bảo mật bằng cách thêm tham số khác. Tạo một hàm băm với dữ liệu và một muối bổ sung và chuyển nó dưới dạng tham số. Trong cookie.php của bạn chỉ cần xác minh dữ liệu bằng $ _GET ['val'], bằng cách tạo lại mã thông báo và so sánh chúng.
Saba M

Nếu bạn đang gửi GET theo cách này, bạn cũng có thể sử dụng AJAX.
dùng10398534

18

Có lẽ bạn có thể sử dụng Iframecho việc này. Facebook có thể sử dụng kỹ thuật này. Bạn có thể đọc thêm về điều này ở đây . Stackoverflow sử dụng kỹ thuật tương tự, nhưng với bộ nhớ cục bộ HTML5, nhiều hơn về điều này trên blog của họ


1
iframe hoạt động hoàn hảo cho giải pháp của tôi, chỉ cần bao gồm các giá trị trong url như yêu cầu nhận thông thường và phản hồi từ máy chủ với giá trị cookie
Joel Davis

Xin lưu ý, bạn phải cấu hình Access-Control-Allow-Origin đúng cách để điều này hoạt động.
dùng10398534

6

Không thể đặt cookie cho tên miền khác.

Nếu bạn muốn truyền dữ liệu sang tên miền khác, bạn có thể mã hóa dữ liệu này vào url.

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page

4
đặt cookie phiên từ url là một rủi ro bảo mật. các url thường được ghi lại và sẽ cho phép kẻ tấn công đánh cắp phiên người dùng
Dane Macaulay

6

Bạn không thể, ít nhất là không trực tiếp. Đó sẽ là một rủi ro bảo mật khó chịu.

Mặc dù bạn có thể chỉ định một thuộc tính Miền , thông số kỹ thuật cho biết "Tác nhân người dùng sẽ từ chối cookie trừ khi thuộc tính Miền chỉ định phạm vi cho cookie sẽ bao gồm máy chủ gốc."

Vì máy chủ gốc là a.comvà không bao gồm b.com, nên nó không thể được đặt.

Bạn sẽ cần phải có b.comđể đặt cookie thay thế. Bạn có thể thực hiện việc này thông qua (ví dụ) chuyển hướng HTTP đến b.comvà quay lại.


Tôi biết đây là một phản hồi cũ, nhưng tại sao điều này sẽ là một rủi ro bảo mật? Bạn có thể đặt cookie trong bảng điều khiển của bạn hoặc trong một phần mở rộng? Tại sao nó có vấn đề nếu bạn có thể đặt cookie cho một tên miền khác?
Timberman

@Timberman - Câu hỏi là về JavaScript chạy trên một trang web không có trong các công cụ dành cho nhà phát triển và không phải là một tiện ích mở rộng được cài đặt rõ ràng. Nó sẽ là một rủi ro bảo mật bởi vì bất kỳ ai truy cập đều evil-hack.com có thể đặt cookie để their-favourite-website.comthay đổi tùy chọn của họ trên trang web đó.
Quentin

Tôi hiểu điều đó, nhưng làm thế nào nó là một rủi ro bảo mật? Tôi khá chắc chắn rằng nó không có gì để làm bảo mật khôn ngoan?
Timberman

@Timberman - Nếu bạn không thể thấy vấn đề với trang web của kẻ tấn công thay đổi tùy chọn của bạn cho một trang web hoàn toàn khác thì tôi không biết làm thế nào để giải thích rõ ràng hơn nữa.
Quentin

Tôi thấy vấn đề, nhưng tôi không thấy đó là một rủi ro bảo mật. Tôi đồng ý với bạn rằng javascript không thể đặt cookie cho một tên miền khác, nhưng vấn đề bảo mật là như thế nào nếu có thể?
Timberman

5

Trong trường hợp bạn có a.my-company.comb.my-company.comthay vì chỉ a.comb.combạn có thể phát hành cookie cho .my-company.comtên miền - nó sẽ được chấp nhận và gửi đến cả hai miền.


1
có thể tạo cookie trong a.my-company.com cho b.my-company.com không?
mahesh kajale

1
Trừ khi my-company.com nằm trong Danh sách lỗ đen Suffix công khai, trong trường hợp đó, trình duyệt sẽ âm thầm bỏ qua mọi nỗ lực để đặt cookie! : '- (
Michael

5

xem RFC6265 :

Tác nhân người dùng sẽ từ chối cookie trừ khi thuộc tính Miền chỉ định phạm vi cho cookie sẽ bao gồm máy chủ gốc. Ví dụ: tác nhân người dùng sẽ chấp nhận cookie có thuộc tính Miền là "example.com" hoặc "foo.example.com" từ foo.example.com, nhưng tác nhân người dùng sẽ không chấp nhận cookie có thuộc tính Miền là "bar.example.com" hoặc của "baz.foo.example.com".

LƯU Ý: Vì lý do bảo mật, nhiều tác nhân người dùng được cấu hình để từ chối các thuộc tính Miền tương ứng với "hậu tố công cộng". Ví dụ: một số tác nhân người dùng sẽ từ chối các thuộc tính Miền của "com" hoặc "co.uk". (Xem Phần 5.3 để biết thêm thông tin.)

Nhưng cách giải quyết được đề cập ở trên với hình ảnh / iframe hoạt động, mặc dù điều đó không được khuyến nghị do tính không an toàn của nó.


1

Bạn không thể, nhưng ... Nếu bạn sở hữu cả hai trang thì ...

1) Bạn có thể gửi dữ liệu qua thông số truy vấn ( http://siteB.com/?key=value )

2) Bạn có thể tạo iframe của Trang web B bên trong trang A và bạn có thể gửi tin nhắn từ nơi này sang nơi khác. Vì Trang web B là chủ sở hữu của cookie trang B, nó sẽ có thể đặt bất kỳ giá trị nào bạn cần bằng cách xử lý đúng thông báo bài đăng. (Bạn nên ngăn những người gửi không mong muốn khác gửi tin nhắn cho bạn! Điều đó tùy thuộc vào bạn và cơ chế bạn quyết định sử dụng để ngăn điều đó xảy ra)


0

Trong liên kết này, chúng tôi sẽ tìm thấy Liên kết giải pháp .

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);

Điều đó sẽ không làm việc. Xem thông số kỹ thuật : "Tác nhân người dùng sẽ từ chối cookie trừ khi thuộc tính Miền chỉ định phạm vi cho cookie bao gồm máy chủ gốc."
Quentin

0

Gửi yêu cầu POST từ A. Yêu cầu gửi bài chỉ ở trên máy chủ và khách hàng không thể truy cập.

Bạn có thể gửi yêu cầu POST từ a.comđể b.comsử dụng CURL (được khuyến nghị, máy chủ) hoặc một method="POST"hình thức ẩn (clientide). Nếu bạn đi sau, bạn có thể muốn làm xáo trộn JavaScript của mình để người dùng không thể hiểu thuật toán và can thiệp vào nó.

Tạo một cổng vào b.comđể đặt cookie:

<?php
    if (isset($_POST['data']) {
        setcookie('a', $_POST['data']);
        header("Location: b.com/landingpage");
    }
?>

Nếu bạn muốn đưa bảo mật tiến thêm một bước, hãy triển khai một chức năng trên cả hai mặt ( a.comb.com) để mã hóa (bật a.com) và giải mã (bật b.com) dữ liệu bằng cách sử dụng một mật mã học.

Nếu bạn đang cố gắng làm điều gì đó phải an toàn tuyệt đối (ví dụ: chuyển phiên đăng nhập), hãy thử oAuth hoặc lấy cảm hứng từ https://api.cloudianos.com/docs#v2/auth

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.