วิธีตั้งค่าคุกกี้สำหรับโดเมนอื่น


166

ว่าฉันมีเว็บไซต์ที่เรียกว่าa.comและเมื่อหน้าเฉพาะของเว็บไซต์นี้ถูกโหลดบอกว่าการเชื่อมโยงหน้าผมชอบที่จะตั้งค่าคุกกี้สำหรับเว็บไซต์อื่นที่เรียกว่าแล้วเปลี่ยนเส้นทางให้ผู้ใช้b.comb.com

ผมหมายถึงในการโหลดของa.com/linkฉันต้องการที่จะตั้งค่าคุกกี้สำหรับผู้ใช้และเปลี่ยนเส้นทางไปยังb.comb.com

ผมทดสอบและเบราว์เซอร์ที่ได้รับจริงคุกกี้จากแต่มันก็ไม่ได้ส่งคุกกี้ที่เกี่ยวกับการร้องขอการเปลี่ยนเส้นทางไปยังa.com/link b.comเป็นเรื่องปกติหรือไม่

เราสามารถตั้งค่าคุกกี้สำหรับโดเมนอื่นได้หรือไม่


โปรดทราบว่าหากคุณใช้พารามิเตอร์ URL เพื่อตั้งค่าคุกกี้บน b.com ใคร ๆ ก็สามารถบังคับค่าคุกกี้ใด ๆ บน b.com จากเว็บไซต์ใด ๆ
Julien

2
ใช้ iFrame ของ b.com ซึ่งเป็นชุดคุกกี้;)
Jaquarh

คำตอบ:


129

คุณไม่สามารถตั้งค่าคุกกี้สำหรับโดเมนอื่น การอนุญาตสิ่งนี้จะทำให้เกิดข้อบกพร่องด้านความปลอดภัยอย่างมาก

คุณต้องได้รับ b.com เพื่อตั้งค่าคุกกี้ หาก a.com เปลี่ยนเส้นทางผู้ใช้ไปยังb.com/setcookie.php?c=value

สคริปต์ setcookie อาจมีรายการต่อไปนี้เพื่อตั้งค่าคุกกี้และเปลี่ยนเส้นทางไปยังหน้าที่ถูกต้องใน b.com

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

ยัง a.com สามารถแทรกข้อมูลเดียวกันในรูปแบบของส่วนหัวเมื่อเปลี่ยนเส้นทางไปยัง b.com ได้หรือไม่ เหตุใดจึงไม่แสดงข้อบกพร่องด้านความปลอดภัย
Coder

3
@Coder ส่วน setcookie จะส่งผลให้ส่วนหัวของคุกกี้ถูกส่งไปยังเบราว์เซอร์จาก b.com a.com ไม่สามารถส่งส่วนหัวของคุกกี้จาก b.com
qbert220

ใช่มันไม่ปลอดภัยมาก แต่ก็ใช้งานได้ หาก OP เป็นเจ้าของ a.com และ b.com และคุกกี้นั้นค่อนข้างเล็กน้อยก็อาจจะใช้ได้
rocketsarefast

1
ควรสังเกตให้ดีขึ้นในคำตอบว่าสิ่งนี้ไม่ปลอดภัยแม้ว่าจะได้ผล
Roy Ling

2
คุณจะพูดอย่างไรว่า youtube กำลังอ่านคุกกี้ที่สร้างโดย gmail เพื่อแสดงบัญชีของพวกเขาบน youtube
Taha SULTAN TEMURI

55

คล้ายกับคำตอบยอดนิยม แต่แทนที่จะเปลี่ยนเส้นทางไปที่หน้าและกลับมาอีกครั้งซึ่งจะทำให้ผู้ใช้ประสบการณ์ที่ไม่ดีคุณสามารถตั้งค่าภาพในโดเมน A

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

แล้วในโดเมน B ที่เป็น example.com ใน cookie.php คุณจะมีรหัสต่อไปนี้:

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

Hattip ถึงSubin


1
แฮ็คที่ดี ... :)
2560

16
ระวังว่าอาจเป็นความคิดที่แย่มาก คุณหลีกเลี่ยงการป้องกันคุกกี้อย่างตั้งใจโดยให้ทุกคนส่งคำขอ GET ที่ออกแบบมาเพื่อตั้งค่าคุกกี้นั้นตามค่าที่ต้องการ ฉันไม่รู้ว่าคุณทำอะไรกับคุกกี้นั้น แต่ฉันหวังว่ามันจะไม่เกี่ยวข้องกับยอดเงินในธนาคาร
Scott Stafford

ฉันรับรองได้ว่าจะไม่เกี่ยวข้องกับยอดเงินในธนาคาร แต่จุดดี :)
Jonathan

2
ถ้าชอบในกรณีนี้ทุกคนสามารถโทรโดเมนนี้ด้วยพารามิเตอร์ของตัวเองคุณสามารถเพิ่มความปลอดภัยโดยการเพิ่มพารามิเตอร์อื่น สร้างแฮชด้วยข้อมูลและเกลือเพิ่มเติมและส่งผ่านเป็นพารามิเตอร์ ใน cookie.php ของคุณเพียงตรวจสอบข้อมูลใน $ _GET ['val'] โดยสร้างโทเค็นใหม่และทำการเปรียบเทียบ
Seba M

หากคุณกำลังส่ง GET ด้วยวิธีนี้คุณสามารถใช้ AJAX ได้เช่นกัน
user10398534

18

Probaly คุณสามารถใช้Iframeสำหรับสิ่งนี้ Facebook อาจใช้เทคนิคนี้ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่ Stackoverflow ใช้เทคนิคที่คล้ายกัน แต่ด้วยที่จัดเก็บในตัว HTML5 จะมีข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ในบล็อกของพวกเขา


1
iframe ทำงานได้อย่างสมบูรณ์แบบสำหรับโซลูชันของฉันเพียงแค่รวมค่าใน url เช่นรับคำขอปกติและตอบสนองจากเซิร์ฟเวอร์ที่มีค่าคุกกี้
Joel Davis

ได้รับคำแนะนำคุณจะต้องกำหนดค่า Access-Control-Allow-Origin ให้ถูกต้องเพื่อให้สามารถใช้งานได้
user10398534

6

ไม่สามารถตั้งค่าคุกกี้สำหรับโดเมนอื่นได้

หากคุณต้องการส่งผ่านข้อมูลไปยังโดเมนอื่นคุณสามารถเข้ารหัสได้ใน URL

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

4
การตั้งค่าเซสชันคุกกี้จาก url เป็นความเสี่ยงด้านความปลอดภัย โดยปกติแล้ว URL จะถูกบันทึกและอนุญาตให้ผู้โจมตีขโมยเซสชันผู้ใช้
Dane Macaulay

6

อย่างน้อยคุณไม่สามารถทำได้ นั่นเป็นความเสี่ยงด้านความปลอดภัยที่น่ารังเกียจ

ในขณะที่คุณสามารถระบุแอตทริบิวต์โดเมน , สเปคบอกว่า "ตัวแทนผู้ใช้จะปฏิเสธคุกกี้เว้นแต่แอตทริบิวต์โดเมนระบุขอบเขตการคุกกี้ที่จะรวมเซิร์ฟเวอร์ต้นทาง."

เนื่องจากเซิร์ฟเวอร์ต้นทางเป็นa.comและไม่รวมอยู่b.comจึงไม่สามารถตั้งค่าได้

คุณจะต้องb.comตั้งค่าคุกกี้แทน คุณสามารถทำได้ผ่าน (ตัวอย่าง) HTTP เปลี่ยนเส้นทางไปb.comและกลับ


ฉันรู้ว่านี่เป็นการตอบสนองแบบเก่า แต่ทำไมสิ่งนี้ถึงมีความเสี่ยงด้านความปลอดภัย คุณสามารถตั้งค่าคุกกี้ในคอนโซลของคุณหรือในส่วนขยายได้หรือไม่? ทำไมมันจะสำคัญถ้าคุณสามารถตั้งค่าคุกกี้สำหรับโดเมนอื่นได้
Timberman

@Timberman - คำถามเกี่ยวกับ JavaScript ที่ทำงานบนเว็บไซต์ไม่ได้อยู่ในเครื่องมือของนักพัฒนาและไม่ได้อยู่ในส่วนขยายที่ติดตั้งไว้อย่างชัดเจน มันจะเป็นความเสี่ยงด้านความปลอดภัยเพราะใครก็ตามที่เยี่ยมชมevil-hack.com อาจมีชุดคุกกี้สำหรับtheir-favourite-website.comที่จะเปลี่ยนการตั้งค่าของพวกเขาในเว็บไซต์นั้น
เควนติ

ฉันเข้าใจว่า แต่ความเสี่ยงด้านความปลอดภัยเป็นอย่างไร ฉันค่อนข้างแน่ใจว่าไม่มีสิ่งใดที่จะทำเรื่องความปลอดภัยอย่างชาญฉลาด?
Timberman

@Timberman - หากคุณไม่เห็นปัญหาเกี่ยวกับเว็บไซต์ของผู้โจมตีที่เปลี่ยนการตั้งค่าของคุณสำหรับเว็บไซต์ที่แตกต่างไปจากเดิมอย่างสิ้นเชิงฉันก็ไม่รู้จะอธิบายได้อย่างไร
เควนติ

ฉันเห็นปัญหา แต่ไม่เห็นว่าเป็นความเสี่ยงด้านความปลอดภัยหรือไม่ ฉันเห็นด้วยกับคุณว่าจาวาสคริปต์ไม่สามารถตั้งค่าคุกกี้สำหรับโดเมนอื่นได้ แต่จะมีปัญหาด้านความปลอดภัยได้อย่างไรถ้าทำได้?
Timberman

5

ในกรณีที่คุณมีa.my-company.comและb.my-company.comแทนที่จะเป็นเพียงแค่a.comและb.comคุณสามารถออกคุกกี้สำหรับ.my-company.comโดเมน - มันจะได้รับการยอมรับและส่งไปยังทั้งสองโดเมน


1
เป็นไปได้หรือไม่ที่จะสร้างคุกกี้ใน a.my-company.com สำหรับ b.my-company.com
mahesh kajale

1
เว้นแต่ my-company.com จะอยู่ในPublic หลุมดำในรายการ Suffixซึ่งในกรณีนี้เบราว์เซอร์จะเพิกเฉยต่อความพยายามทั้งหมดในการตั้งค่าคุกกี้! : '- (
Michael

5

ดูRFC6265 :

ตัวแทนผู้ใช้จะปฏิเสธคุกกี้เว้นแต่แอตทริบิวต์ Domain จะระบุขอบเขตสำหรับคุกกี้ที่จะรวมเซิร์ฟเวอร์ต้นทาง ตัวอย่างเช่นตัวแทนผู้ใช้จะยอมรับคุกกี้ที่มีแอตทริบิวต์โดเมนของ "example.com" หรือ "foo.example.com" จาก foo.example.com แต่ตัวแทนผู้ใช้จะไม่ยอมรับคุกกี้ที่มีแอตทริบิวต์ Domain ของ "bar.example.com" หรือจาก "baz.foo.example.com"

หมายเหตุ: เพื่อเหตุผลด้านความปลอดภัยตัวแทนผู้ใช้จำนวนมากได้รับการกำหนดค่าให้ปฏิเสธแอตทริบิวต์ของโดเมนที่สอดคล้องกับ "ส่วนต่อท้ายสาธารณะ" ตัวอย่างเช่นตัวแทนผู้ใช้บางรายจะปฏิเสธคุณสมบัติโดเมนของ "com" หรือ "co.uk" (ดูหัวข้อ 5.3 สำหรับข้อมูลเพิ่มเติม)

แต่วิธีการดังกล่าวข้างต้นมีผลงานภาพ / iframe แม้ว่าจะไม่แนะนำเนื่องจากความไม่มั่นคง


1

คุณทำไม่ได้ แต่ ... หากคุณเป็นเจ้าของทั้งสองหน้า ...

1) คุณสามารถส่งข้อมูลผ่าน Params แบบสอบถาม ( http://siteB.com/?key=value )

2) คุณสามารถสร้าง iframe ของไซต์ B ภายในไซต์ A และคุณสามารถส่งข้อความโพสต์จากที่หนึ่งไปยังอีกที่หนึ่งได้ เนื่องจากไซต์ B เป็นเจ้าของคุกกี้ไซต์ B จะสามารถกำหนดค่าที่คุณต้องการได้โดยการประมวลผลข้อความโพสต์ที่ถูกต้อง (คุณควรป้องกันผู้ส่งที่ไม่ต้องการรายอื่น ๆ เพื่อส่งข้อความถึงคุณ! นั่นขึ้นอยู่กับคุณและกลไกที่คุณตัดสินใจที่จะใช้เพื่อป้องกันไม่ให้เกิดขึ้น)


0

ในการเชื่อมโยงนี้เราจะหาทางแก้ปัญหาการเชื่อมโยง

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

1
นั่นไม่ได้ผล ดูข้อมูลจำเพาะ : "ตัวแทนผู้ใช้จะปฏิเสธคุกกี้เว้นแต่ว่าแอตทริบิวต์ของโดเมนจะกำหนดขอบเขตสำหรับคุกกี้ที่จะรวมเซิร์ฟเวอร์ต้นทาง"
เควนติ

0

ส่งคำขอ POST จาก A. คำร้องขอการโพสต์อยู่บนเซิร์ฟเวอร์เท่านั้นและไม่สามารถเข้าถึงได้โดยลูกค้า

คุณสามารถส่งคำขอ POST จากa.comไปยังb.comโดยใช้ CURL (แนะนำ, เซิร์ฟเวอร์) หรือmethod="POST"ฟอร์มที่ซ่อนอยู่(ไคลเอนต์) หากคุณไปในภายหลังคุณอาจต้องการทำให้ JavaScript สับสนเพื่อที่ผู้ใช้จะไม่สามารถเข้าใจอัลกอริทึมและรบกวนมันได้

สร้างเกตเวย์b.comเพื่อตั้งค่าคุกกี้:

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

หากคุณต้องการเพิ่มความปลอดภัยอีกขั้นให้ใช้ฟังก์ชั่นทั้งสองด้าน ( a.comและb.com) เพื่อเข้ารหัส (เปิดa.com) และถอดรหัส (เปิดb.com) ข้อมูลโดยใช้ Cypher เข้ารหัส

หากคุณกำลังพยายามทำสิ่งที่ปลอดภัยอย่างแน่นอน (เช่นถ่ายโอนเซสชันการเข้าสู่ระบบ) ลองoAuthหรือรับแรงบันดาลใจจากhttps://api.cloudianos.com/docs#v2/auth

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.