Safari 13+ iframe, CORS çerezlerini engeller


10

Safari düz çıkışı, ana alan adından farklı alanların iframe'lerinde çerez ayarlamanıza izin vermez, sunucu tarafı CORS başlıkları lanetlenir.

Açıklığa kavuşturmak için: kullanıcı domainA.com'da. DomainB.com için bir iframe açıktır ve iframe içindeki domainB.com'da kullanıcının kimliğini doğrulamaya çalışır. Set-Cookie üstbilgisi, gerekli tüm üstbilgilerle domainB.com iframe içindeki sunucudan döndürülür, ancak Safari sonraki aramalarda geri göndermez.

Eski bir geçici çözüm, iframe'den bir form gönderme yapıyor ve yanıtta çerezi ayarlıyordu. Sanırım kullanıcı formu göndermek için bir şey tıklamıştı hoşuma gitti. Form gönderimlerinin geri çağrıları olmadığından ve HttpOnly çerezlerinde yapamadığınız için çerezin yanıtın ne zaman geri döndüğünü görmesi için anket yapmanız gerekir, ancak hey, işe yaradı! Kadar yoktu.

Ardından, daha yeni bir geçici çözüm kullanıcıyı yepyeni bir pencere / sekmedeki iframe alanına yönlendiriyordu, orada rastgele bir çerez ayarlıyordu ve o andan itibaren bu alt alan iframe içinde "güvenilir" idi. Yine, yeni pencereyi / sekmeyi açmak için bir tıklama gerekiyordu ve yeni sekme açıklığının görsel bir göstergesi bile vardı. Çok güvenlik, bu standartlar.

Ve şimdi, Safari 13'ten itibaren - Artık geçici çözüm yok. Artık güvenli iframe çerez ayarı yok 🤬

Başka herhangi bir kimlik doğrulama düzeni bizim için iyi değildir (örn. Auth-X başlığı). Bu token'ın herhangi bir şekilde javascript istemci tarafı tarafından erişilebilir olmasını istemediğimizden, HttpOnly güvenli bir çerez kullanmamız gerekir.

Açık olmak gerekirse, diğer tarayıcılarda her şey harika çalışıyor.

İlgili WebKit Bugzilla

Kimsenin önerisi var mı?

Düzenle:

@Tomschmidt bağlantısı için teşekkürler, bu doğru yön gibi görünüyor. Apple'ın Depolama Erişimi API'sını kullanmayı denedim, ancak maalesef, giriş mantığımı API ile başlatmadan önce erişim isteğinde bulunduğumdan emin olmama rağmen:

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();

Yine de, / login API yanıtında alınan çerezler, daha sonraki API çağrılarında gönderilmiyor :(


Bunun yalnızca onclick gibi iframe ile açık etkileşimde tetiklendiğinden emin olun.
tomschmidt

1
Evet, işte böyle yaptım. Bağlantı verdiğim webkit bugzilla sorununu kontrol edin, sanırım bu Safari'nin sonundaki gerçek bir hata: /
Tom Teman

Sorun çerezlerin gönderilmemesi değil. Depolama erişimi talep ederseniz, mevcut çerezler sunucuya gönderilir. Sorun, yeni çerezlerin hiç saklanmamasıdır, bu nedenle gönderilecekleri yoktur.
Matt Cosentino

@MattCosentino evet, demek istediğim - "/ login API yanıtında alınan çerezler", iframe etki alanına Set-Cookie üstbilgisi yanıtında geri gönderilen yeni çerezlerdir, ancak iframe etki alanından sonraki çağrı, bunları içermez istekte çerezler. Yani evet, sorunun kökünün bu senaryoda tarayıcıda yeni çerezlerin depolanmadığını söylemek daha doğru.
Tom Teman

Yanıtlar:



0

Bu nedenle, yeni pencere depolamak istediğiniz çerezi sakladığı sürece geçici çözüm hala çalışır. İframe hala kendi çerezlerini saklayamıyor. Benim durumumda, tek ihtiyacım olan oturum kimliği çereziydi. Bu nedenle, kullanıcı depolama erişimi verdiğinde küçük bir açılır pencere açarım. Oturum kimliği çerezi alır ve depolar, iframe'i kapatır ve yeniden yükler. İframe daha sonra oturum kimliği çerezine erişebilir ve bunu sonraki isteklerde gönderir. Bence bu sadece geçici, gelecekte açılır pencerelerden depolama erişimini kaldıracak gibi görünüyor. Belki iframe o zamana kadar çerezleri saklayamayacaklarını düzeltirler.


Matt, masaüstünde Safari 13.1 üzerinde çalışan bir açılır pencere ile benzer bir çözüm kullandım, ancak bir iPad Safari 13.4 üzerinde test çalışmıyor. Bunu bir iPad'de çalıştırabildiniz mi? Thnx
teamdane

HI Matt, iframe kodunda veya ana sayfada açılır pencereyi açtığınız yer. Ayrıca bazı örnek kod alabilir miyim,
Dnyan Waychal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.