Cara mengatur cookie untuk domain lain

166

Katakanlah saya memiliki situs web yang dipanggil a.com, dan ketika halaman tertentu dari situs ini dimuat, katakan tautan halaman, saya ingin mengatur cookie untuk situs lain yang dipanggil b.com, kemudian mengarahkan pengguna ke b.com.

Maksud saya, saat memuat a.com/linksaya ingin mengatur cookie untuk b.comdan mengarahkan pengguna ke b.com.

Saya mengujinya, dan browser benar-benar menerima cookie dari a.com/link, tetapi tidak mengirim cookie itu pada permintaan pengalihan b.com. Apakah ini normal?

Bisakah kita menetapkan cookie untuk domain lain?

Rasoul Zabihi
sumber
Ketahuilah bahwa jika Anda menggunakan parameter URL untuk mengatur cookie di b.com, maka siapa pun dapat memaksakan nilai cookie apa pun di b.com dari situs web mana pun.
Julien
2
gunakan iFrame of b.com yang merupakan cookie;)
Jaquarh

Jawaban:

129

Anda tidak dapat menetapkan cookie untuk domain lain. Membiarkan ini akan menghadirkan kelemahan keamanan yang sangat besar.

Anda harus meminta b.com untuk mengatur cookie. Jika a.com mengarahkan pengguna keb.com/setcookie.php?c=value

Script setcookie dapat berisi yang berikut untuk mengatur cookie dan mengarahkan ke halaman yang benar di b.com

<?php
    setcookie('a', $_GET['c']);
    header("Location: b.com/landingpage.php");
?>
qbert220
sumber
Namun a.com dapat memasukkan data yang sama dalam bentuk tajuk saat mengarahkan ke b.com, bukan? Mengapa ini tidak menghadirkan kelemahan keamanan?
Coder
3
@Coder, fungsi setcookie akan menghasilkan header cookie yang dikirim ke browser dari b.com. a.com tidak dapat mengirim header cookie dari b.com.
qbert220
ya ini sangat tidak aman, tetapi itu berhasil. Jika OP memiliki a.com dan b.com dan cookie itu cukup sepele, mungkin itu baik-baik saja.
rocketsarefast
1
lebih baik perhatikan dalam jawaban bahwa ini tidak aman meskipun berfungsi.
Roy Ling
2
bagaimana Anda bisa mengatakan ini namun youtube sedang membaca cookie yang dibuat oleh gmail untuk menunjukkan akun mereka di youtube?
TAHA SULTAN TEMURI
55

Mirip dengan jawaban teratas, tetapi alih-alih mengarahkan ulang ke halaman dan kembali lagi yang akan menyebabkan pengalaman pengguna yang buruk Anda dapat mengatur gambar pada domain A.

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

Dan kemudian pada domain B yaitu example.com di cookie.php Anda akan memiliki kode berikut:

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

Hattip ke Subin

Jonathan
sumber
1
hack bagus ... :)
sotn
16
Waspadai itu mungkin Ide yang Sangat Buruk. Anda menghindari perlindungan cookie yang sangat disengaja dengan membiarkan siapa pun mengirim permintaan GET buatan untuk menetapkan cookie itu ke nilai apa pun yang mereka inginkan. Saya tidak tahu apa yang Anda lakukan pada cookie itu, tetapi saya harap itu tidak melibatkan saldo bank.
Scott Stafford
Saya dapat meyakinkan Anda bahwa itu tidak melibatkan saldo bank. Tapi poin bagus :)
Jonathan
2
Jika seperti dalam kasus ini setiap orang dapat memanggil domain ini dengan parameter mereka sendiri, Anda dapat menambahkan keamanan dengan menambahkan parameter lain. Buat hash dengan data dan garam tambahan dan berikan sebagai parameter. Di cookie.php Anda cukup verifikasi data dalam $ _GET ['val'], dengan membuat ulang token dan membandingkannya.
Seba M
Jika Anda mengirim GET dengan cara ini, Anda juga dapat menggunakan AJAX.
user10398534
18

Probaly bisa Anda gunakan Iframeuntuk ini. Facebook mungkin menggunakan teknik ini. Anda dapat membaca lebih lanjut tentang ini di sini . Stackoverflow menggunakan teknik serupa, tetapi dengan penyimpanan lokal HTML5, lebih banyak tentang ini di blog mereka

Ondrej Bozek
sumber
1
iframe bekerja dengan sempurna untuk solusi saya, cukup sertakan nilai-nilai di url seperti permintaan dapatkan yang normal dan respons dari server dengan nilai cookie
Joel Davis
Maklum, Anda harus mengkonfigurasi Access-Control-Allow-Origin dengan benar agar ini berfungsi.
user10398534
6

Pengaturan cookie untuk domain lain tidak dimungkinkan.

Jika Anda ingin meneruskan data ke domain lain, Anda dapat menyandikan ini ke url.

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page
Patrik
sumber
4
menetapkan cookie sesi dari url adalah risiko keamanan. url biasanya dicatat dan akan memungkinkan penyerang mencuri sesi pengguna
Dane Macaulay
6

Anda tidak bisa, setidaknya tidak secara langsung. Itu akan menjadi risiko keamanan yang buruk.

Meskipun Anda dapat menentukan atribut Domain , spesifikasi mengatakan "Agen pengguna akan menolak cookie kecuali atribut Domain menentukan cakupan untuk cookie yang akan menyertakan server asal."

Karena server asal adalah a.comdan yang tidak termasuk b.com, itu tidak dapat diatur.

Anda harus b.commengatur cookie sebagai gantinya. Anda dapat melakukan ini melalui (misalnya) pengalihan HTTP ke b.comdan kembali.

Quentin
sumber
Saya tahu ini adalah respons lama, tetapi mengapa ini menjadi risiko keamanan? Anda dapat mengatur cookie di konsol Anda atau dalam ekstensi? Mengapa penting jika Anda dapat menetapkan cookie untuk domain yang berbeda?
Timberman
@Timberman - Pertanyaannya adalah tentang JavaScript yang berjalan di situs web bukan di alat pengembang dan bukan di ekstensi yang dipasang secara eksplisit. Ini akan menjadi risiko keamanan karena siapa pun yang mengunjungi evil-hack.com dapat memiliki cookie their-favourite-website.comyang akan mengubah preferensi mereka di situs web itu.
Quentin
Saya mengerti itu, tetapi bagaimana itu risiko keamanan? Saya cukup yakin itu tidak ada hubungannya keamanan bijaksana?
Timberman
@Timberman - Jika Anda tidak dapat melihat masalah dengan situs penyerang mengubah preferensi Anda untuk situs yang sama sekali berbeda maka saya tidak tahu bagaimana menjelaskannya dengan lebih jelas.
Quentin
Saya melihat masalahnya, tetapi saya tidak melihat bagaimana ini merupakan risiko keamanan. Saya setuju dengan Anda bahwa javascript seharusnya tidak dapat mengatur cookie untuk domain yang berbeda, tetapi bagaimana itu masalah keamanan jika bisa?
Timberman
5

Jika Anda memiliki a.my-company.comdan b.my-company.comalih-alih adil a.comdan b.comAnda dapat mengeluarkan cookie untuk .my-company.comdomain - cookie akan diterima dan dikirim ke kedua domain tersebut.

stop-cran
sumber
1
apakah mungkin membuat cookie di a.my-company.com untuk b.my-company.com?
mahesh kajale
1
Kecuali my-company.com ada dalam Daftar Lubang Hitam Sufiks Publik dalam hal ini browser akan mengabaikan semua upaya untuk mengatur cookie secara diam-diam! : '- (
Michael
5

lihat RFC6265 :

Agen pengguna akan menolak cookie kecuali atribut Domain menentukan cakupan untuk cookie yang akan menyertakan server asal. Misalnya, agen pengguna akan menerima cookie dengan atribut Domain "example.com" atau "foo.example.com" dari foo.example.com, tetapi agen pengguna tidak akan menerima cookie dengan atribut Domain dari "bar.example.com" atau dari "baz.foo.example.com".

CATATAN: Untuk alasan keamanan, banyak agen pengguna dikonfigurasikan untuk menolak atribut Domain yang sesuai dengan "sufiks publik". Misalnya, beberapa agen pengguna akan menolak atribut Domain "com" atau "co.uk". (Lihat Bagian 5.3 untuk informasi lebih lanjut.)

Tetapi solusi yang disebutkan di atas dengan gambar / iframe berfungsi, meskipun tidak disarankan karena ketidakamanannya.

Roy Ling
sumber
1

Anda tidak bisa, tetapi ... Jika Anda memiliki kedua halaman maka ...

1) Anda dapat mengirim data melalui params kueri ( http://siteB.com/?key=value )

2) Anda dapat membuat iframe Situs B di dalam situs A dan Anda dapat mengirim pesan pos dari satu tempat ke tempat lain. Karena Situs B adalah pemilik cookie situs B, ia akan dapat menetapkan nilai apa pun yang Anda butuhkan dengan memproses pesan posting yang benar. (Anda harus mencegah pengirim lain yang tidak diinginkan untuk mengirim pesan kepada Anda! Terserah Anda dan mekanisme yang Anda putuskan untuk digunakan agar hal itu tidak terjadi)

cSn
sumber
0

Dalam link ini, kita akan menemukan solusi link .

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);
Hariharan AR
sumber
1
Itu tidak akan berhasil. Lihat spesifikasi : "Agen pengguna akan menolak cookie kecuali atribut Domain menentukan lingkup untuk cookie yang akan menyertakan server asal."
Quentin
0

Kirim permintaan POST dari A. Permintaan posting hanya ada di sisi server dan tidak dapat diakses oleh klien.

Anda dapat mengirim permintaan POST dari a.comke b.commenggunakan CURL (disarankan, serverside) atau disembunyikan method="POST"bentuk (clientside). Jika Anda memilih yang terakhir, Anda mungkin ingin mengaburkan JavaScript Anda sehingga pengguna tidak akan dapat memahami algoritma dan mengganggunya.

Aktifkan gateway b.comuntuk mengatur cookie:

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

Jika Anda ingin membawa keamanan selangkah lebih maju, terapkan fungsi pada kedua sisi ( a.comdan b.com) untuk mengenkripsi (aktif a.com) dan mendekripsi b.comdata (aktif ) menggunakan cypher kriptografi.

Jika Anda mencoba melakukan sesuatu yang benar-benar aman (misalnya mentransfer sesi login), cobalah oAuth atau ambil inspirasi dari https://api.cloudianos.com/docs#v2/auth

pengguna10398534
sumber