Safari 3. taraf çerez iframe numarası artık çalışmıyor mu?


137

Bu, "Safari'de çalışmak için 3. taraf çerezlerini nasıl alabilirim" sorusunun on üçüncü intikamıdır, ancak yine de soruyorum çünkü oyun alanının belki de Şubat 2012'den sonra değiştiğini düşünüyorum. Safari'deki parti çerezleri şöyleydi: gizli bir iframe'e POST yapmak için bazı javascript kullanın. Safari'yi, kullanıcının 3. taraf içeriğiyle etkileşime girdiğini düşünmek için kandırır ve böylece çerezlerin ayarlanmasına izin verir.

Ben düşünüyorum bu kaçamak Google'ın kendi reklamlarıyla bu hile kullandığını ortaya çıktı hafif skandalının ardından kapatıldı. En azından bu hileyi kullanırken Safari'de çerez ayarlayamadım. Apple'ın boşluğu kapatmak için çalıştığını iddia eden bazı rastgele internet gönderileri ortaya çıkardım, ancak resmi bir kelime bulamadım.

Bir yedek olarak, içerik yüklenmeden önce bir düğmeyi tıklamanız gerektiğinden ana üçüncü taraf çerçevesini yeniden tasarlamayı denedim, ancak bu doğrudan etkileşim düzeyi bile Safari'nin soğuk soğuk kalbini eritmek için yeterli değildi.

Peki Safari'nin bu boşluğu gerçekten kapatıp kapatmadığını bilen var mı? Öyleyse, başka geçici çözümler var mı (her istekte manuel olarak bir oturum kimliği eklemek dışında)?


21
Çerezleri gereken bir üçüncü taraf iframe kullanarak kesinlikle değil tanımı gereği bir güvenlik saldırısı! Çok sayıda farklı alanda bir iframe'de kullanılan bir web mağazasını çalıştırıyoruz ve geç saatlerde Safari ile ilgili her türlü sorun yaşıyoruz, bu yüzden bu (meşru) sorunun cevabıyla da çok ilgileniyorum.
Mart'ta mscha

14
Facebook uygulamaları oluşturan herkesin Safari'de bu sorunu var. Facebook uygulamaları bir iframe'de çalışır ve tanım gereği tümü 3. taraflardan gelir. Bu yüzden Facebook uygulamalarında Safari desteği biraz sivilceli: çerezleri kullanamazsınız.
gs hurley

Bu sorunu safari 5.1.7'de çoğaltamıyorum. Varsayılan "üçüncü taraf çerezleri yok" ayarına sahip facebook uygulamam iframe'den çerezi kabul eder. Ancak, aynı ayarlı Chrome 19.0.1084.46, çerezi engeller.
Evgeny Shadchnev

4
(Neyse ki) varsayılan olmayan "Üçüncü taraf çerezlerini ve site verilerini engelle" seçeneği işaretli Chrome 19+, Safari'nin varsayılan "Üçüncü taraflardan ve reklamverenlerden gelen çerezleri engelle" ayarından daha sert / daha serttir. Chrome'da, 3. taraf etki alanını ziyaret etmenize ve çerezleri ayarlamış olsanız bile, bunlar iframe'e iletilmez. Kullanıcının aslında Chrome güvenlik ayarlarına alan adınız için bir "istisna" eklemesi gerekir.
Aaron Gibralter

Şubat 2012 ile ne demek istiyorsun? Safari'de teknik bir değişiklik veya kanun değişikliği var mı?
sıvı

Yanıtlar:


51

Sadece burada kullanıcı etkileşimi gerektirmeyen basit bir çalışma çözümü bırakmak istedim .

Ben de belirtildiği gibi yazı yaptığım :

Temel olarak yapmanız gereken tek şey sayfanızı top.location'a yüklemek, oturumu oluşturmak ve tekrar facebook'a yönlendirmektir.

Bu kodu en üstünüze ekleyin index.phpve $page_urluygulama son sekmesi / uygulama URL'nize ayarlayın ; uygulamanızın sorunsuz çalışacağını göreceksiniz.

<?php
    // START SAFARI SESSION FIX
    session_start();
    $page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
    if (isset($_GET["start_session"]))
        die(header("Location:" . $page_url));

    if (!isset($_GET["sid"]))
        die(header("Location:?sid=" . session_id()));
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid):
?>
   <script>
        top.window.location="?start_session=true";
    </script>
<?php
    endif;
    // END SAFARI SESSION FIX
?>

Not: Bu facebook için yapıldı, ancak aslında diğer benzer durumlarda işe yarayacaktı.


Düzenleme 20-Aralık-2012 - İmzalı İsteğin Bakımı:

Yukarıdaki kod, istek sonrası verilerini korumaz ve uygulamanız imzalı isteğe bağlıysa, işaretli_fazeyi kaybedersiniz, aşağıdaki kodu denemekten çekinmeyin:

Not: Bu hala düzgün bir şekilde test edilmektedir ve ilk sürümden daha az kararlı olabilir. Kendi sorumluluğunuzdadır kullanın / Geribildirim takdir.

( CBroe sayesinde beni doğru yöne yönlendirdiği için çözümü geliştirmemize teşekkürler )

// Start Session Fix
session_start();
$page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
if (isset($_GET["start_session"]))
    die(header("Location:" . $page_url));
$sid = session_id();
if (!isset($_GET["sid"]))
{
    if(isset($_POST["signed_request"]))
       $_SESSION["signed_request"] = $_POST["signed_request"];
    die(header("Location:?sid=" . $sid));
}
if (empty($sid) || $_GET["sid"] != $sid)
    die('<script>top.window.location="?start_session=true";</script>');
// End Session Fix

Teşekkür ederim, bir cazibe gibi çalışır ve mevcut uygulamalarda uygulamak çok kolaydır :-)
SamiSalami

Bu temelde birkaç yönlendirme ile çalışıyor, değil mi?
Aaron Gibralter

1
@hugoderhungrige hoş geldiniz, yeni bir sürüm ekledim, uygulamalarınızdaki imzalı isteği sürdürmeniz gerekiyorsa kontrol etmekten çekinmeyin.
Diogo Raminhos

1
@CBroe Bunu işaret ettiğiniz için çok teşekkür ederim! Haklıydın, işe yarıyor, çünkü ikinci istekle kullanıcının zaten bir oturumu başladı! Sanırım "görmek istemeyen en kötü kördür".
Diogo Raminhos

1
@Whiteagle 1 ve 2'yi gösteren bir test durumu sağlayabilir misiniz?
Gajus

35

İçerik yüklenmeden önce kullanıcılarınızın bir düğmeyi tıklatmak istediğinizi söylediniz. Benim çözümüm, yeni bir tarayıcı penceresi açmak için bir düğmeye basmaktı. Bu pencere alan adım için bir çerez ayarlıyor, açıcıyı yeniliyor ve ardından kapanıyor.

Böylece ana komut dosyanız şöyle görünebilir:

<?php if(count($_COOKIE) > 0): ?>
<!--Main Content Stuff-->
<?php else: ?>
<a href="/safari_cookie_fix.php" target="_blank">Click here to load content</a>
<?php endif ?>

Sonra safari_cookie_fix.php şöyle görünür:

<?php
setcookie("safari_test", "1");
?>
<html>
    <head>
        <title>Safari Fix</title>
        <script type="text/javascript" src="/libraries/prototype.min.js"></script>
    </head>
    <body>
    <script type="text/javascript">
    document.observe('dom:loaded', function(){
        window.opener.location.reload();
        window.close();
    })
    </script>
    This window should close automatically
    </body>
</html>

Böyle bir şey düşünüyordum. Kusursuz çalışır. İzin iletişim kutusuyla birlikte yüklüyorum. Teşekkürler!
vwoelm

Bu, Safari'nin ayarları etrafında da çalışıyor gibi görünüyor ve ortak olduğunda, bilgi tıpkı diğer "çözümler" gibi eksilecek. Tamamen farklı bir çözüm arıyorum, çünkü 3. taraf çerezlerinin uygun şekillerde kullanıldığında bile şeytan olduğu oldukça açık hale geliyor.
LocalPCGuy,

1
Bu çözüm benim için çalıştı, ancak pop-up gerekli mi? İframe'inizi safari sayfasına yönlendirebilir, çerezi ayarlayabilir ve ardından yeniden yönlendirme başlıklarıyla oyuna yeniden yönlendirebilir misiniz? Veya kullanıcının sunucu ile bir tür doğrudan teması olması için açılır pencereye mi ihtiyacınız var?
Anthony Hastings

bu iyi çalıştı; Neyse ki, bunu başlatmak için bir düğmeye basmak benim app büyük bir anlaşma değildi.
littlered

@LocalPCGuy Diğer çözümlerde olduğu gibi alaşağı olacağından pek emin değilim çünkü bir kullanıcının pop-up'ın engellenmemesi için sayfayı tıklatması / etkileşim kurması gerekir. Safari'nin ortaya çıkardığı bu çözüm iyi çalışıyor gibi görünüyor: reklamverenler, alanlar arası çerezleri gizlice ayarlayamayacak ve gömülü uygulamalar, bir çerez ayarlayabilmek için kullanıcının etkileşim kurmasını gerektirecektir.
Aaron Gibralter

15

Safari'yi bir .htaccess ile kandırdım:

#http://www.w3.org/P3P/validator.html
<IfModule mod_headers.c>
Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID CUR ADM DEV OUR BUS\""
Header set Set-Cookie "test_cookie=1"
</IfModule>

Ve benim için de çalışmayı bıraktı. Tüm uygulamalarım Safari'de oturumu kaybediyor ve Facebook'tan yeniden yönlendiriyor. Bu uygulamaları düzeltmek için acele ettiğim için şu anda bir çözüm arıyorum. Seni haberdar edeceğim.

Edit (2012-04-06): Görünüşe göre Apple 5.1.4 ile "sabitledi". Eminim bu Google'a verilen tepkidir: "Çerez politikasının uygulanmasında bir sorun vardı. Safari'deki" Çerezleri Engelle "tercihi" Üçüncü taraflardan ve reklamverenlerden ". Http://support.apple.com/kb/HT5190


1
Görünüşe göre Apple 5.1.4 ile "sabitledi". Eminim bu Google'a verilen tepkidir: "Çerez politikasının uygulanmasında bir sorun vardı. Safari'deki" Çerezleri Engelle "tercihi" Üçüncü taraflardan ve reklamverenlerden ". Support.apple.com/kb/HT5190
vwoelm

1
Bu yüzden vwoelm'in bu yorumu aradığım cevaba en yakın olduğunu düşünüyorum. Her şeyden önce, Apple'ın boşluk deliğini kesin olarak kapattığını ve Apple destek makalesine yapılan referansın sadece bu olduğunu doğrulamak istedim. Sorumun ikinci kısmı yine de ilgili. Geçici çözümler için seçenekler nelerdir? Açıkça, oturum kimliklerini GET / POST parametreleri olarak kodlayabiliriz, ancak diğer seçenekler nelerdir. Yerel depolama bu bağlamda çalışıyor mu? Flash çerezleri?
gs hurley

@vwoelm: gerçekten aradığım (ama ummadığım) cevap bu değil. Bunu bir yorum yerine bir cevaba koyarsanız, size ödül atarım.
mscha

3
@gshurley GET / POST parametreleri aracılığıyla oturum kimlikleri göndermek tek seçenek. Bu güvensizdir, ancak yine de Facebook bizi yine de SSL olmadan tuval uygulamaları sunmaya zorluyor. Ve bir Facebook uygulamasını hackleyerek gerçekten ne elde edersiniz haha? Apple'ın merhametindeyiz ve şu anda acımasız moddalar.
hekevintran

14

Ruby on Rails denetleyicinizde şunları kullanabilirsiniz:

private

before_filter :safari_cookie_fix

def safari_cookie_fix
  user_agent = UserAgent.parse(request.user_agent) # Uses useragent gem!
  if user_agent.browser == 'Safari' # we apply the fix..
    return if session[:safari_cookie_fixed] # it is already fixed.. continue
    if params[:safari_cookie_fix].present? # we should be top window and able to set cookies.. so fix the issue :)
      session[:safari_cookie_fixed] = true
      redirect_to params[:return_to]
    else
      # Redirect the top frame to your server..
      render :text => "<script>alert('start redirect');top.window.location='?safari_cookie_fix=true&return_to=#{set_your_return_url}';</script>"
    end
  end
end

Safari oturumları ile benzer bir sorun var mı?
Raylar başlangıç

if_rame'in içindeyken set_your_return_url yerine request.env ['HTTP_REFERER']
yazabilirsiniz

Bu çözümü denedim ve tek sorun, üst iframe URL'sine geri dönemem. Rails'te üst iframe'in URL'sini elde etmek için bir yöntem var mı? thanks
idejuan

Zamanımı aldı ama sonunda en kolay yolun (TMO) raylar uygulamasının yönlendirme URL'sine bir sorgu dizesi parametresi olarak eklemek olduğunu anladım. Wasy ve temiz.
guyaloni

1
Bu yanıt, yaygın bir güvenlik sorunu olan açık bir yeniden yönlendirici oluşturur. Tehlikeli kod redirect_to params[:return_to]. Bu parametrenin, yönlendirilecek güvenli yerlerin beyaz listesiyle karşılaştırılması gerekir. Bkz. Owasp.org/index.php/…
phylae

13

Özel durumum için window.postMessage () kullanarak ve herhangi bir kullanıcı etkileşimini ortadan kaldırarak sorunu çözdüm. Bunun yalnızca bir şekilde üst pencerede js çalıştırabiliyorsanız işe yarayacağını unutmayın. Alan adınızdan bir js eklemesini sağlayarak veya kaynağa doğrudan erişiminiz varsa.

İframe'de (domain-b) bir çerezin olup olmadığını kontrol ederim ve ayarlanmadıysa üst öğeye (domain-a) bir postMessage gönderir. Örneğin;

if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1
    && document.cookie.indexOf("safari_cookie_fix") < 0) {
    window.parent.postMessage(JSON.stringify({ event: "safariCookieFix", data: {} }));
}

Sonra üst pencerede (domain-a) etkinliği dinleyin.

if (typeof window.addEventListener !== "undefined") {
    window.addEventListener("message", messageReceived, false);
}

function messageReceived (e) {
    var data;

    if (e.origin !== "http://www.domain-b.com") {
        return;
    }

    try {
        data = JSON.parse(e.data);
    }
    catch (err) {
        return;
    }

    if (typeof data !== "object" || typeof data.event !== "string" || typeof data.data === "undefined") {
        return;
    }

    if (data.event === "safariCookieFix") {
        window.location.href = e.origin + "/safari/cookiefix"; // Or whatever your url is
        return;
    }
}

Son olarak sunucunuzda (http://www.domain-b.com/safari/cookiefix) çerezi ayarlarsınız ve kullanıcının geldiği yere yönlendirirsiniz. Aşağıdaki örnek ASP.NET MVC kullanıyor

public class SafariController : Controller
{
    [HttpGet]
    public ActionResult CookieFix()
    {
        Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "1"));

        return Redirect(Request.UrlReferrer != null ? Request.UrlReferrer.OriginalString : "http://www.domain-a.com/");
    }

}

PostMessage çağrınızda bir sözdizimi hatası almıyorsunuz?
akousmata

İhtiyaç ikinci parametre eklemek için "*"için PostMessagesözdizimi hatayı düzeltmek için
Michael Baldry

Bu cevabı daha fazla oy verebilseydim. Bu sorunu ele almanın en basit ve en doğru yolu. Gönderdiğiniz için teşekkür ederiz!
AaronP

9

Aynı problemi yaşadım ve bugün benim için iyi bir düzeltme buldum. Kullanıcı aracısı varsa Safarive hiçbir çerez ayarlanmadıysa, kullanıcıyı OAuth İletişim Kutusuna yönlendiririm:

<?php if ( ! count($_COOKIE) > 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari')) { ?>
<script type="text/javascript">
    window.top.location.href = 'https://www.facebook.com/dialog/oauth/?client_id=APP_ID&redirect_uri=MY_TAB_URL&scope=SCOPE';
</script>
<?php } ?>

Kimlik doğrulamasından ve izin istedikten sonra OAuth İletişim Kutusu en üst konumdaki URI'ma yönlendirir. Böylece çerezleri ayarlamak mümkündür. Tüm tuval ve sayfa sekmesi uygulamalarımız için şu komut dosyasını ekledim:

<script type="text/javascript">
    if (top.location.href==location.href) top.location.href = 'MY_TAB_URL';
</script>

Böylece kullanıcı, geçerli bir çerez ayarlanmış olarak tekrar Facebook sayfası sekmesine yönlendirilir ve imzalanan istek tekrar gönderilir.


Bu konuda harika bir çalışma. Chrome'un kullanıcı aracısı dizesinde de Safari olduğundan Chrome'un kullanıcı aracısında olmadığından emin olmak için kullanıcı aracısı kontrolünü güncelledim. Alanınızın sayfasına yönlendirmek, gerekli çerezleri ayarlamak / oturumu başlatmak ve ardından apps.facebook.com adresinden uygulamanıza geri yönlendirmek bir cazibe gibi çalıştı. Aptalca görünüyor, ama iyi çalışıyor. Bahşiş için Sascha teşekkürler!
Mike

7

Sonunda çerezleri açıkça PHP'de ayarladığımdan, Sascha'nın sağladığı çözüm için benzer bir çözüm buldum, ancak bazı küçük ayarlarla:

// excecute this code if user has not authorized the application yet
// $facebook object must have been created before

$accessToken = $_COOKIE['access_token']

if ( empty($accessToken) && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') ) {

    $accessToken = $facebook->getAccessToken();
    $redirectUri = 'https://URL_WHERE_APP_IS_LOCATED?access_token=' . $accessToken;

} else {

    $redirectUri = 'https://apps.facebook.com/APP_NAMESPACE/';

}

// generate link to auth dialog
$linkToOauthDialog = $facebook->getLoginUrl(
    array(
        'scope'         =>  SCOPE_PARAMS,
        'redirect_uri'  =>  $redirectUri
    )
);

echo '<script>window.top.location.href="' . $linkToOauthDialog . '";</script>';

Bunun yaptığı, tarayıcı safari olduğunda çerezin kullanılabilir olup olmadığını kontrol etmektir. Bir sonraki adımda, uygulama alanındayız, yani yukarıda URL_WHERE_APP_IS_LOCATED olarak sağlanan URI.

if (isset($_GET['accessToken'])) {

    // cookie has a lifetime of only 10 seconds, so that after
    // authorization it will disappear
    setcookie("access_token", $_GET['accessToken'], 10); 

} else {

  // depending on your application specific requirements
  // redirect, call or execute authorization code again
  // with the cookie now set, this should return FB Graph results

}

Bu yüzden uygulama etki alanına yeniden yönlendirildikten sonra, bir çerez açıkça ayarlanır ve kullanıcıyı yetkilendirme işlemine yönlendiririm.

Benim durumumda (CakePHP kullandığımdan, ancak diğer MVC çerçevelerinde iyi çalıştığı için) FB yetkisinin başka bir kez yürütüldüğü giriş eylemini tekrar çağırıyorum ve bu sefer mevcut çerez nedeniyle başarılı.

Uygulamayı bir kez yetkilendirdikten sonra, uygulamayı Safari ile kullanırken daha fazla sorun yaşamadım (5.1.6)

Umarım bu herkese yardımcı olabilir.


1
Bu benim için çalıştı !! Teşekkürler!! .. Safari 5.1.7 ile bu sorunu yaşıyordum .... şimdi çözüldü!
Khalizar

5

Bu sorunu iOS çalıştıran cihazlarda yaşadım. Bir iframe kullanarak normal bir web sitesine yerleştirilebilir bir dükkan yaptım. Her nasılsa, her sayfa yükünde kullanıcı yeni bir oturum kimliği aldı, bu da oturumda bazı değerler bulunmadığından kullanıcıların sürecin yarısına sıkışmasına neden oldu.

Bu sayfada verilen çözümlerden bazılarını denedim, ancak pop-up'lar bir iPad'de çok iyi çalışmıyor ve en şeffaf çözüme ihtiyacım vardı.

Bir yönlendirme kullanarak çözdüm. Sitemi yerleştiren web sitesinin önce kullanıcıyı siteme yönlendirmesi gerekir, böylece üst çerçeve siteme URL'yi içerir, burada bir çerez ayarladım ve kullanıcıyı sitemi yerleştiren web sitesindeki uygun sayfaya yönlendirdiğim iletilir url aracılığıyla.

Örnek PHP kodu

Uzak web sitesi kullanıcıyı şuraya yönlendiriyor:

http://clientname.example.com/init.php?redir=http://www.domain.com/shop/frame

init.php

<?php
// set a cookie for a year
setcookie('initialized','1',time() + 3600 * 24 * 365, '/', '.domain.com', false, false);
header('location: ' . $_GET['redir']);
die;

Kullanıcı, http://www.domain.com/shop/framesitemin gömülü olduğu yere, oturumları olması gerektiği gibi depolayıp çerezleri yiyor.

Umarım bu birine yardımcı olur.


3

ASP.NET MVC 4 benim düzeltmeyi paylaşmama izin verin. Ana fikir PHP için doğru cevap gibi. Komut dosyaları bölümünün yanındaki üstbilgideki ana Mizanpaja eklenen sonraki kod:

@if (Request.Browser.Browser=="Safari")
{
    string pageUrl = Request.Url.GetLeftPart(UriPartial.Path);
    if (Request.Params["safarifix"] != null && Request.Params["safarifix"] == "doSafariFix")
    {
        Session["IsActiveSession"] = true;
        Response.Redirect(pageUrl);
        Response.End();
    }
        else if(Session["IsActiveSession"]==null)
    {
        <script>top.window.location = "?safarifix=doSafariFix";</script>
    }
}

3

Bu çözüm bazı durumlarda geçerlidir - mümkünse:

İframe içerik sayfası iframe'i içeren sayfanın bir alt alan adını kullanıyorsa, çerez artık engellenmez.


Bu yararlı bilgiler - tam aradığım şey. Çoğu insanın alan adlarını değiştiremeyeceğinden emin olsam da, bunu yapacağım. Yerleştirdiğim sitenin IP alanımla ve bu etki alanı için benim tarafımda bir VHost ile eşleşen ve iFrame'de bu URL'yi kullanan bir <mycompany>. <theircompany> .com alt etki alanı oluşturmasını sağlayın. Karmaşık, ancak kurşun geçirmez olmalıdır.
Elocution Safari

1
Alt alan adıyla https kullanıyorsanız, alt alan sunucusunun eşleşmesi için bir SSL sertifikasına ihtiyacı olacağı için bu durum karmaşıklaşabilir.
Roger Halliburton

1

Google aslında kediyi bu çantadan çıkardı. İzleme çerezlerine erişmek için bir süredir kullanıyorlardı. Hemen hemen Apple = \

orijinal Wall Street Journal yazısı


Google'ı biliyorum, ancak Apple'ın aslında bunu "düzelttiği" (ve internetin yarısını bozduğu) hakkında hiçbir şey görmedim. Bununla ilgili herhangi bir ayrıntı var mı?
mscha

1

İşte kullandığım bazı kod. Sitemden herhangi bir çerez ayarlarsam, çerezlerin o zamandan itibaren iframe'de sihirli bir şekilde çalıştığını buldum.

http://developsocialapps.com/foundations-of-a-facebook-app-framework/

 if (isset($_GET['setdefaultcookie'])) {
        // top level page, set default cookie then redirect back to canvas page
        setcookie ('default',"1",0,"/");
        $url = substr($_SERVER['REQUEST_URI'],strrpos($_SERVER['REQUEST_URI'],"/")+1);
        $url = str_replace("setdefaultcookie","defaultcookieset",$url);
        $url = $facebookapp->getCanvasUrl($url);
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    } else if ((!isset($_COOKIE['default'])) && (!isset($_GET['defaultcookieset']))) {
        // no default cookie, so we need to redirect to top level and set
        $url = $_SERVER['REQUEST_URI'];
        if (strpos($url,"?") === false) $url .= "?";
        else $url .= "&";
        $url .= "setdefaultcookie=1";
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    }

1

PHP'de başkalarının yayınladıklarının biraz basit bir sürümü:

if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) {
    print '<script>top.window.location="https://example.com/?start_session=true";</script>';
    exit();
}

if (isset($_GET['start_session'])) {
    header("Location: https://apps.facebook.com/YOUR_APP_ID/");
    exit();
}

1

Bunun için mükemmel bir cevap buldum, Allan burada tüm krediyi hak eden bir adam sayesinde. ( http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/ )

Onun çözümü basit ve anlaşılması kolaydır.

İframe içerik sunucusunda (etki alanı 2), aşağıdakileri içeren kök etki alanı düzeyinde startsession.php adlı bir dosya ekleyin :

<?php
// startsession.php
session_start();
$_SESSION['ensure_session'] = true;
die(header('location: '.$_GET['return']));

Şimdi iframe'i (domain1) içeren üst düzey web sitesinde, iframe'i içeren sayfaya yapılan çağrı şöyle görünmelidir:

<a href="https://domain2/startsession.php?return=http://domain1/pageWithiFrame.html">page with iFrame</a>

Ve bu kadar! Simples :)

Bunun nedeni, tarayıcıyı üçüncü taraf URL'sine yönlendirmeniz ve bu nedenle iframe içinde içerik göstermeden önce ona güvenmesini söylemenizdir.


0

Ben değiştirilmiş (bağlantıya sign_request param eklendi) Whiteagle'ın hile ve safari için Tamam çalıştı, ama IE sürekli bu durumda sayfayı yeniliyor. Safari ve internet explorer için çözümüm:

$fbapplink = 'https://apps.facebook.com/[appnamespace]/';
$isms = stripos($_SERVER['HTTP_USER_AGENT'], 'msie') !== false;

// safari fix
if(! $isms  && !isset($_SESSION['signed_request'])) {

    if (isset($_GET["start_session"])) {
        $_SESSION['signed_request'] = $_GET['signed_request'];
        die(header("Location:" . $fbapplink ));

    }
    if (!isset($_GET["sid"])) {
        die(header("Location:?sid=" . session_id() . '&signed_request='.$_REQUEST['signed_request']));
    }
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid) {
    ?>
    <script>
        top.window.location="?start_session=true";
    </script>
    <?php
    exit;
    }
}

// IE fix
header('P3P: CP="CAO PSA OUR"');
header('P3P: CP="HONK"');


.. later in the code

$sr = $_REQUEST['signed_request'];
if($sr) {
        $_SESSION['signed_request'] = $sr;
} else {
        $sr = $_SESSION['signed_request'];
}

0

Ayrıca bu sorundan muzdarip oldum, ancak sonunda çözümü aldım, Başlangıçta doğrudan iframe URL'sini küçük açılır pencere gibi tarayıcıya yükleyin, ardından yalnızca iframe içindeki oturum değerlerine erişin.



-2

$_SESSIONDeğişkenden hep birlikte kurtulmaya karar verdim ve oturumu taklit etmek için memcache etrafına bir paket yazdım.

Https://github.com/manpreetssethi/utils/blob/master/Session_manager.php adresini kontrol edin

Kullanım örneği: Bir kullanıcının uygulamaya geldiği anda, imzalanan isteği Session_manager kullanarak saklayın ve önbellekte olduğundan, bundan sonra herhangi bir sayfadan erişebilirsiniz.

Not: Sayfa yeniden yüklendiğinde session_id sıfırlandığı için Safari'de özel olarak göz atarken bu çalışmaz. (Aptal Safari)


-9

Başlık p3p politikası olarak ekleyerek bu sorunu çözebilirsiniz .. Ben safari aynı sorunu vardı bu yüzden dosyaların üstüne başlık ekledikten sonra benim sorunum çözüldü.

<?php
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
?>

Bunun (hala) Safari'nin en son sürümüyle çalıştığından emin misiniz? IE için yıllardır P3P başlıklarımız var, ancak Safari hala bozuk.
mscha

2
Tüm çerezlerinizi temizlemeyi deneyin ve tekrar test edin. Tarayıcınızda iframed siteniz için zaten çerezler varsa sorun kendini göstermez.
rmarscher

Hmmm, P3P başlıklarını da çalıştıramıyorum. Yine de IE'de çalışıyorlar!
Seth Brown

2
Bu eskiden işe yarar. Ancak Safari'nin en son sürümü için öyle değil. Önbelleğinizi temizleyin ve tekrar deneyin ....
chantheman

2
Bu çözümün işe yaradığını belirtmek istiyorum. safari'deki TÜM çerezleri SİLİNDİR. Ve sonra bunu deneyin.
dnuske
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.