Safari 13+ iframe บล็อกคุกกี้ CORS


9

Safari flat out ไม่อนุญาตให้คุณตั้งค่าคุกกี้ใน iframes ของโดเมนที่แตกต่างจากโดเมนหลักส่วนหัว CORS ฝั่งเซิร์ฟเวอร์จะถูกสาป

ในการชี้แจง: ผู้ใช้อยู่ใน domainA.com iframe สำหรับ domainB.com เปิดอยู่และพยายามตรวจสอบสิทธิ์ผู้ใช้ใน domainB.com ภายใน iframe ส่วนหัว Set-Cookie จะถูกส่งคืนจากเซิร์ฟเวอร์ภายใน domainB.com iframe พร้อมด้วยส่วนหัวที่จำเป็นทั้งหมด แต่ Safari ไม่ได้ส่งสายกลับในการโทรครั้งต่อไป

วิธีแก้ปัญหาแบบเก่ากำลังส่งฟอร์มจาก iframe และตั้งค่าคุกกี้ในการตอบกลับ ฉันเดาว่าพวกเขาชอบความจริงที่ว่าผู้ใช้คลิกที่สิ่งที่ต้องการส่งแบบฟอร์ม คุณจะต้องสำรวจความคิดเห็นของคุกกี้เพื่อดูว่าเมื่อใดที่การตอบกลับกลับมาเนื่องจากการส่งแบบฟอร์มไม่มีการเรียกกลับและในกรณีของคุกกี้ HttpOnly ที่คุณทำไม่ได้ แต่เดี๋ยวก่อนทำงานได้! จนกว่ามันจะไม่

จากนั้นวิธีแก้ปัญหาล่าสุดได้เปลี่ยนเส้นทางผู้ใช้ไปยังโดเมน iframe ในหน้าต่าง / แท็บใหม่การตั้งค่าคุกกี้แบบสุ่มที่นั่นและหลังจากนั้นเป็นต้นมาโดเมนย่อยนั้น "เชื่อถือได้" ภายใน iframe อีกครั้งต้องคลิกเพื่อเปิดหน้าต่าง / แท็บใหม่และยังมีข้อบ่งชี้ที่มองเห็นได้ของการเปิดแท็บใหม่ ความปลอดภัยมากมาตรฐานเช่นนี้

และในตอนนี้เช่นเดียวกับ Safari 13 - ไม่มีวิธีแก้ไขเพิ่มเติมอีก ไม่มีการตั้งค่าคุกกี้ iframe ที่ปลอดภัยยิ่งขึ้น 🤬

รูปแบบการตรวจสอบอื่น ๆ ไม่ดีสำหรับเรา (เช่นส่วนหัว Auth-X) เราจำเป็นต้องใช้คุกกี้ที่ปลอดภัยของ HttpOnly เนื่องจากเราไม่ต้องการให้โทเค็นนั้นสามารถเข้าถึงได้โดยไคลเอนต์ Javascript

เพื่อความชัดเจนทุกอย่างใช้งานได้ดีบนเบราว์เซอร์อื่น ๆ

WebKit Bugzilla ที่เกี่ยวข้อง

ไม่มีใครมีข้อเสนอแนะใด ๆ ?

แก้ไข:

ขอบคุณสำหรับลิงค์ @tomschmidt ซึ่งดูเหมือนจะเป็นทิศทางที่ถูกต้อง ฉันพยายามใช้ API การเข้าถึงพื้นที่เก็บข้อมูลของ Apple แต่น่าเสียดายที่ถึงแม้ว่าฉันจะต้องแน่ใจว่าได้ร้องขอการเข้าถึงก่อนที่จะเริ่มต้นตรรกะการเข้าสู่ระบบของฉันด้วย API:

requestStorageAccess = async() => {
    return new Promise(resolve => {
      //@ts-ignore
      document.requestStorageAccess().then(
        function () {
          console.log('Storage access was granted');
          resolve(true);
        },
        function () {
          console.log('Storage access was denied');
          resolve(false);
        }
      );    
    });
  }


const storageAccessGranted = await requestStorageAccess();
console.log(storageAccessGranted) // prints 'true'
await login();

อย่างไรก็ตามคุกกี้ที่ได้รับจากการตอบสนอง / login API จะไม่ได้รับการส่งต่อไปยังการเรียก API ต่อไปนี้ :(


ตรวจสอบให้แน่ใจว่าสิ่งนี้ได้รับการกระตุ้นจากการโต้ตอบอย่างชัดเจนกับ iframe เท่านั้นเช่น onclick
tomschmidt

1
ใช่นั่นเป็นวิธีที่ฉันทำ ตรวจสอบปัญหา webkit bugzilla ที่ฉันเชื่อมโยงฉันเดาว่านี่เป็นข้อผิดพลาดจริง ๆ ในตอนท้ายของ Safari: /
Tom Teman

ปัญหาไม่ใช่ว่าคุกกี้ไม่ได้ส่ง หากคุณร้องขอการเข้าถึงที่เก็บข้อมูลคุกกี้ที่มีอยู่จะถูกส่งไปยังเซิร์ฟเวอร์ ปัญหาคือคุกกี้ใหม่ใด ๆ ไม่ได้ถูกจัดเก็บเลยดังนั้นจึงไม่สามารถส่งได้
Matt Cosentino

@MattCosentino ใช่นั่นคือสิ่งที่ฉันหมายถึง - "คุกกี้ที่ได้รับจากการตอบสนอง / เข้าสู่ระบบ API" เป็นคุกกี้ใหม่ที่ถูกส่งกลับในการตอบสนองส่วนหัว Set-Cookie ไปยังโดเมน iframe แต่การโทรครั้งถัดไปจากโดเมน iframe จะไม่รวม คุกกี้ในคำขอ ใช่แล้วมันถูกต้องมากกว่าที่จะบอกว่ารากของปัญหาคือไม่มีคุกกี้ใหม่ถูกเก็บไว้ในเบราว์เซอร์ในสถานการณ์นี้
Tom Teman

คำตอบ:


1

ฉันคิดว่าฉันอาจพบวิธีแก้ปัญหาแล้ว: Apple Storage Access API: https://webkit.org/blog/8124/introducing-storage-access-api/


เฮ้ขอบคุณสำหรับความคิด แต่ผมเกรงว่ามันไม่ได้ทำเคล็ดลับ (ตรวจสอบคำตอบแก้ไขของฉัน)
ทอมเทมาน

1
ฉันยังมีปัญหาเดียวกันกับซาฟารี 13. วิธีแก้ปัญหาใด ๆ
Niroshana

0

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


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