सफारी 3 पार्टी कुकी iframe चाल अब काम नहीं कर रहा है?


137

तो यह "मैं कैसे सफारी में काम करने के लिए 3 पार्टी कुकीज़ प्राप्त करने के लिए" का umteenth बदला है, लेकिन मैं फिर से पूछ रहा हूं क्योंकि मुझे लगता है कि खेल मैदान बदल गया है, शायद फरवरी 2012 के बाद। 3 पाने के लिए एक मानक चाल में से एक सफारी में पार्टी कुकीज़ निम्नानुसार थीं: कुछ जावास्क्रिप्ट का उपयोग POST को एक छिपे हुए iframe में करें। यह (सफारी में) ट्रिक सफारी को यह सोचकर इस्तेमाल करता है कि उपयोगकर्ता ने 3 पार्टी सामग्री के साथ बातचीत की थी और इसलिए कुकीज़ को सेट करने की अनुमति दी।

मुझे लगता है इस खामियों को हल्के घोटाले के मद्देनजर बंद कर दिया गया है जहां यह पता चला है कि Google अपने विज्ञापनों के साथ उस चाल का उपयोग कर रहा था। बहुत कम से कम, इस चाल का उपयोग करते समय मैं सफारी में कुकीज़ सेट करने में पूरी तरह से असमर्थ रहा हूं। मैंने कुछ बेतरतीब इंटरनेट पोस्टिंग का खुलासा किया, जिसमें दावा किया गया था कि Apple लूपहोल को बंद करने पर काम कर रहा था, लेकिन मुझे कोई आधिकारिक शब्द नहीं मिला।

एक गिरावट के रूप में मैंने मुख्य तीसरे पक्ष के फ्रेम को फिर से डिज़ाइन करने की कोशिश की, ताकि सामग्री लोड होने से पहले आपको एक बटन पर क्लिक करना पड़े, लेकिन यहां तक ​​कि प्रत्यक्ष बातचीत का स्तर सफारी के ठंडे ठंडे दिल को पिघलाने के लिए पर्याप्त नहीं था।

तो क्या किसी को कुछ पता है कि क्या सफारी ने वास्तव में इस खामी को बंद कर दिया है? यदि हां, तो क्या अन्य वर्कअराउंड (मैन्युअल रूप से प्रत्येक अनुरोध में सत्र आईडी सहित अन्य) हैं?


21
एक तृतीय पक्ष iframe का उपयोग करना जो कुकीज़ की आवश्यकता है निश्चित रूप से सुरक्षा हमले की परिभाषा नहीं है! हम एक webshop चलाते हैं जो विभिन्न डोमेन की एक भीड़ पर एक iframe में उपयोग किया जाता है, और सफारी के साथ सभी प्रकार की समस्याएं होती हैं, इसलिए मुझे इस (वैध) प्रश्न के उत्तर में बहुत दिलचस्पी है।
५३ पर मिस्चा

14
बहुत सारे लोग जो फेसबुक ऐप बनाते हैं, उन्हें सफारी के साथ यह समस्या है। फेसबुक ऐप आईफ्रेम में चलते हैं और परिभाषा के अनुसार, सभी 3 पार्टियों से आते हैं। यही कारण है कि फेसबुक ऐप्स पर सफारी के लिए समर्थन थोड़ा धब्बेदार है: आप कुकीज़ का उपयोग नहीं कर सकते।
gs हर्ले

मैं सफारी 5.1.7 पर इस मुद्दे को पुन: पेश नहीं कर सकता। यह डिफ़ॉल्ट रूप से "नो थर्ड पार्टी कुकीज़" सेटिंग के साथ मेरे फेसबुक ऐप iframe से कुकी को स्वीकार करता है। हालाँकि क्रोम 19.0.1084.46 एक ही सेटिंग के साथ कुकी को ब्लॉक करता है।
एवगेनी Shadchnev

4
Chrome 19+ के साथ (धन्यवाद) गैर-डिफ़ॉल्ट "चेक थर्ड-पार्टी कुकीज़ और साइट डेटा" चेक किया गया विकल्प है / सफारी का डिफ़ॉल्ट / यहां तक ​​कि सफारी का डिफ़ॉल्ट "तृतीय पक्षों और विज्ञापनदाताओं की ब्लॉक कुकीज़" सेटिंग से। क्रोम में, भले ही आप 3rd पार्टी डोमेन पर जाएँ और कुकीज़ सेट करें, वे iframe पर प्रेषित नहीं होंगे। उपयोगकर्ता को वास्तव में अपने क्रोम सुरक्षा सेटिंग्स में आपके डोमेन के लिए "अपवाद" जोड़ना होगा।
हारून जिब्राल्टर

फरवरी 2012 के साथ आपका क्या मतलब है? सफारी में तकनीकी बदलाव है या कानून में बदलाव?
तरल

जवाबों:


51

बस यहाँ एक सरल कार्य समाधान छोड़ना चाहता था जिसमें उपयोगकर्ता की सहभागिता की आवश्यकता नहीं होती है

जैसा कि मैंने कहा है पोस्ट था :

मूल रूप से आपको बस इतना करना है कि अपने पृष्ठ को top.location पर लोड करें, सत्र बनाएं और इसे वापस फेसबुक पर पुनः निर्देशित करें।

इस कोड को अपने शीर्ष में जोड़ें index.phpऔर $page_urlअपने एप्लिकेशन के अंतिम टैब / ऐप URL पर सेट करें और आप देखेंगे कि आपका आवेदन बिना किसी समस्या के काम करेगा।

<?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
?>

नोट: यह facebook के लिए बनाया गया था, लेकिन यह वास्तव में इसी तरह की अन्य स्थितियों में काम करेगा।


20-Dec-2012 संपादित करें - हस्ताक्षरित अनुरोध को बनाए रखना:

उपरोक्त कोड अनुरोध पोस्ट डेटा को बनाए नहीं रखता है, और यदि आपका आवेदन हस्ताक्षर किए गए अनुरोधों पर निर्भर करता है, तो आप निचे दिए गए कोड को आज़मा सकते हैं:

नोट: यह अभी भी ठीक से परीक्षण किया जा रहा है और पहले संस्करण की तुलना में कम स्थिर हो सकता है। अपने जोखिम पर उपयोग करें / प्रतिक्रिया की सराहना की है।

( समाधान सुधारने की अनुमति देने के लिए सीबीआरओ का धन्यवाद मुझे यहां सही दिशा में ले जाने के लिए)

// 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

धन्यवाद, एक आकर्षण की तरह काम करता है और मौजूदा क्षुधा में लागू करने के लिए इतना आसान है :-)
SamiSalami

तो यह मूल रूप से पुनर्निर्देश के एक जोड़े के साथ काम करता है, है ना?
हारून जिब्राल्टर

1
@hugoderhungrige आपका स्वागत है, मैंने अभी एक नया संस्करण जोड़ा है, अगर आपको अपने ऐप्स पर हस्ताक्षर किए गए अनुरोध को बनाए रखने की आवश्यकता है, तो इसे आज़ाद करें।
दिओगो रामिनहोस

1
@CBroe इस बात की ओर इशारा करने के लिए आपका बहुत-बहुत धन्यवाद! आप सही थे, यह काम करता है, क्योंकि दूसरे अनुरोध से उपयोगकर्ता पहले से ही एक सत्र शुरू कर चुका है! मुझे लगता है कि "सबसे बुरा अंधा वह है जो नहीं देखना चाहता है"।
डिओगो रामिनहोस

1
@Hiteagle क्या आप 1 और 2 को प्रदर्शित करने वाला परीक्षण केस प्रदान कर सकते हैं?
गजस

35

आपने कहा था कि आप सामग्री लोड होने से पहले अपने उपयोगकर्ताओं को एक बटन क्लिक करने के लिए तैयार थे। मेरा समाधान एक बटन को एक नई ब्राउज़र विंडो खोलना था। वह विंडो मेरे डोमेन के लिए कुकी सेट करती है, ओपनर को रिफ्रेश करती है और फिर बंद हो जाती है।

तो आपकी मुख्य स्क्रिप्ट जैसी दिख सकती है:

<?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 ?>

तब safari_cookie_fix.php जैसा दिखता है:

<?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>

मैं ऐसा ही कुछ सोच रहा था। निर्दोष रूप से काम करता है। मैं इसे अनुमति संवाद के साथ लोड करता हूं। धन्यवाद!
vwoelm

ऐसा लगता है कि यह भी सफारी की सेटिंग्स के आसपास काम कर रहा है, और यह कि, एक बार यह सामान्य ज्ञान दूसरे के समाधानों की तरह ही कुल्हाड़ी हो जाएगी। मैं पूरी तरह से एक अलग समाधान की तलाश कर रहा हूं, क्योंकि यह स्पष्ट हो रहा है कि उपयुक्त तरीके से उपयोग किए जाने पर भी 3 पार्टी कुकीज़ अब शैतान हैं।
लोकलपीसीग्युय

1
इस समाधान ने मेरे लिए काम किया, हालांकि, क्या पॉपअप आवश्यक है? क्या आप अपने आइफ्रेम को सफारी पेज पर रीडायरेक्ट कर सकते हैं, कुकी सेट कर सकते हैं, फिर रीडायरेक्ट हेडर के साथ गेम को फिर से निर्देशित कर सकते हैं? या क्या आपको पॉपअप की आवश्यकता है ताकि उपयोगकर्ता का सर्वर से सीधे संपर्क का कोई रूप हो?
एंथनी हेस्टिंग्स

यह अच्छी तरह से काम किया; सौभाग्य से, इसे शुरू करने के लिए एक बटन का धक्का मेरे ऐप में बहुत बड़ी बात नहीं थी।
littlered

@LocalPCGuy मुझे इतना यकीन नहीं है कि यह अन्य समाधानों की तरह कुल्हाड़ी लेगा, क्योंकि इसके लिए आवश्यक है कि उपयोगकर्ता पॉपअप को अवरुद्ध न करने के लिए पेज के साथ वास्तव में क्लिक / इंटरैक्ट करे। यह समाधान जो सफारी के साथ आया है वह अच्छी तरह से काम करता है: विज्ञापन गुप्त रूप से क्रॉस-डोमेन कुकीज़ सेट करने में सक्षम नहीं होंगे, और एम्बेडेड ऐप्स को कुकी सेट करने में सक्षम होने से पहले उपयोगकर्ता से बातचीत करने की आवश्यकता होगी।
हारून जिब्राल्टर

15

मैंने एक .htaccess के साथ सफारी को धोखा दिया:

#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>

और इसने मेरे लिए काम करना भी बंद कर दिया। मेरे सभी ऐप सफारी में सत्र खो रहे हैं और फेसबुक से बाहर भेज रहे हैं। जैसा कि मैं उन ऐप्स को ठीक करने की जल्दी में हूं, मैं वर्तमान में एक समाधान खोज रहा हूं। मैं तुम्हें तैनात रखेंगे।

संपादित करें (2012-04-06): जाहिरा तौर पर Apple ने इसे 5.1.4 के साथ "निश्चित" कर दिया। मुझे यकीन है कि यह Google-प्रतिक्रिया पर प्रतिक्रिया है: "एक मुद्दा अपनी कुकी नीति के प्रवर्तन में मौजूद था। यदि" सफारी में ब्लॉक कुकीज़ "वरीयता को डिफ़ॉल्ट सेटिंग पर सेट किया गया था, तो तृतीय-पक्ष वेबसाइट कुकीज़ सेट कर सकती हैं। तीसरे पक्ष और विज्ञापनदाताओं से। " http://support.apple.com/kb/HT5190


1
जाहिरा तौर पर Apple ने इसे 5.1.4 के साथ "निश्चित" कर दिया। मुझे यकीन है कि यह Google-प्रतिक्रिया पर प्रतिक्रिया है: "एक मुद्दा अपनी कुकी नीति के प्रवर्तन में मौजूद था। यदि" सफारी में ब्लॉक कुकीज़ "वरीयता को डिफ़ॉल्ट सेटिंग पर सेट किया गया था, तो तृतीय-पक्ष वेबसाइट कुकीज़ सेट कर सकती हैं। तृतीय पक्षों और विज्ञापनदाताओं से "। Support.apple.com/kb/HT5190
vwoelm

1
इसलिए मुझे लगता है कि vwoelm की यह टिप्पणी उस उत्तर के सबसे करीब है जिसकी मुझे तलाश थी। सबसे पहले और सबसे महत्वपूर्ण, मैं पुष्टि करना चाहता था कि Apple ने निश्चित रूप से खामियों को बंद कर दिया है और Apple समर्थन लेख का संदर्भ बस यही है। मेरे प्रश्न का दूसरा भाग हालांकि अभी भी संबंधित है। वर्कअराउंड के लिए विकल्पों की श्रेणी क्या है। स्पष्ट रूप से, हम सत्र आईडी को GET / POST परम के रूप में एन्कोड कर सकते हैं लेकिन अन्य विकल्प क्या हैं। क्या स्थानीय भंडारण इस संदर्भ में काम करता है? फ्लैश कुकीज़?
gs हर्ली

@vwoelm: यह वास्तव में जवाब है जो मैं देख रहा था (लेकिन उम्मीद नहीं)। यदि आप इसे एक टिप्पणी के बजाय एक उत्तर में रखते हैं, तो मैं आपको इनाम प्रदान करूंगा।
मचचा

3
@gshurley मुझे लगता है कि GET / POST पैराम के माध्यम से सत्र आईडी भेजना एकमात्र विकल्प है। यह असुरक्षित है, लेकिन फिर फेसबुक हमें किसी भी तरह एसएसएल के बिना कैनवास एप्लिकेशन की सेवा करने के लिए मजबूर करता है। और इसके अलावा फेसबुक ऐप हाहा को हैक करके आपको वास्तव में क्या मिलता है? हम Apple की दया पर हैं और वे वर्तमान में क्रूर मोड में हैं।
Hekevintran

14

अपने रूबी ऑन रेल कंट्रोलर में आप इसका उपयोग कर सकते हैं:

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

क्या सफारी में सत्रों के साथ भी ऐसी ही समस्या है?
रेल्स शुरुआत

यदि आप एक iframe के अंदर हैं, तो आप set_your_return_url को request.env ['HTTP_REFERER'] में बदल सकते हैं:
--D

मैंने इस समाधान की कोशिश की है, और एकमात्र मुद्दा यह है कि मैं मूल iframe url पर वापस नहीं लौट सकता। क्या माता-पिता के मूत्रल को प्राप्त करने के लिए रेल में एक विधि है? धन्यवाद
idejuan

मुझे समय लगा, लेकिन आखिरकार मुझे पता चला कि सबसे आसान तरीका (TMO) है, बस इसे रेल-ऐप के पुनर्निर्देशन url- स्ट्रिंग पैरामीटर के रूप में जोड़ना है। धोबी और साफ।
मसलोनी

1
यह उत्तर एक खुला पुनर्निर्देशक बनाता है, जो एक सामान्य सुरक्षा समस्या है। खतरनाक कोड है redirect_to params[:return_to]। उस परम को सुरक्षित स्थानों के श्वेतसूची के खिलाफ पुनर्निर्देशित करने की आवश्यकता है। देखें owasp.org/index.php/...
phylae

13

अपनी विशिष्ट स्थिति के लिए मैंने window.postMessage () का उपयोग करके और किसी भी उपयोगकर्ता सहभागिता को समाप्त करके समस्या का समाधान किया। ध्यान दें कि यह केवल तभी काम करेगा जब आप किसी तरह से मूल विंडो में js निष्पादित कर सकते हैं। या तो इसमें आपके डोमेन से एक js शामिल है, या यदि आपके पास स्रोत तक सीधी पहुंच है।

Iframe में (domain-b) i कुकी की उपस्थिति के लिए जाँच करता है और यदि यह सेट नहीं होता है तो अभिभावक (domain-a) को पोस्टमासेज भेजेगा। उदाहरण के लिए,

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: {} }));
}

फिर मूल विंडो में (डोमेन-ए) घटना के लिए सुनो।

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;
    }
}

अंत में आपके सर्वर (http://www.domain-b.com/safari/cookiefix) पर आप कुकी सेट करते हैं और उपयोगकर्ता को जहां से आए थे, वहां वापस भेज देते हैं। नीचे उदाहरण ASP.NET MVC का उपयोग कर रहा है

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/");
    }

}

आपको पोस्टमैसेज में अपने कॉल के साथ सिंटैक्स त्रुटि नहीं मिल रही है?
akousmata

वाक्यविन्यास त्रुटि को ठीक "*"करने के PostMessageलिए दूसरे पैरामीटर को जोड़ने की आवश्यकता है
माइकल बाल्ड्री

काश मैं इस जवाब को और अधिक उभार दे पाता। यह वास्तव में इस मुद्दे को संबोधित करने का सबसे सरल और सबसे सही तरीका है। इसे पोस्ट करने के लिए धन्यवाद!
एरोनप

9

मुझे भी यही समस्या थी और आज मुझे एक ऐसा समाधान मिला जो मेरे लिए ठीक काम करता है। यदि उपयोगकर्ता एजेंट सम्‍मिलित है Safariऔर कोई कुकीज़ सेट नहीं है, तो मैं उपयोगकर्ता को OAuth डायलॉग पर पुनर्निर्देशित करता हूं:

<?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 } ?>

प्रमाणीकरण के बाद और अनुमति माँगने पर OAuth संवाद शीर्ष स्थान पर मेरे URI पर पुनर्निर्देशित कर देगा। तो कुकीज़ सेट करना संभव है। हमारे सभी कैनवास और पृष्ठ टैब ऐप्स के लिए मैंने पहले ही निम्न स्क्रिप्ट शामिल कर ली है:

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

इसलिए उपयोगकर्ता को फेसबुक पेज टैब पर फिर से पहले से निर्धारित एक वैध कुकी के साथ पुनः निर्देशित किया जाएगा और हस्ताक्षरित अनुरोध फिर से पोस्ट किया गया है।


इस पर शानदार काम हुआ। मैंने यह सुनिश्चित करने के लिए उपयोगकर्ता एजेंट जाँच को अपडेट किया कि Chrome उपयोगकर्ता एजेंट में नहीं था और साथ ही साथ क्रोम के पास उपयोगकर्ता एजेंट स्ट्रिंग में सफारी भी है। अपने डोमेन के पेज पर रीडायरेक्ट करना, आवश्यक कुकीज़ / शुरुआती सत्र सेट करना और फिर apps.facebook.com पर अपने ऐप पर वापस भेजना एक आकर्षण की तरह काम करता है। मूर्खतापूर्ण लगता है, लेकिन अच्छा काम करता है। टिप के लिए साशा धन्यवाद!
माइक

7

मैं आखिरकार उसी तरह के समाधान के लिए गया जो साशा ने प्रदान किया, हालांकि कुछ थोड़े समायोजन के साथ, क्योंकि मैं कुकीज़ को स्पष्ट रूप से PHP में सेट कर रहा हूं:

// 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>';

ब्राउजर के सफारी होने पर कुकी उपलब्ध होने पर यह जाँच करता है। अगले चरण में, हम एप्लिकेशन डोमेन पर हैं, अर्थात् यूआरआई को URL_WHERE_APP_IS_LOCATED है।

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

}

इसलिए एप्लिकेशन डोमेन पर पुनर्निर्देशित होने के बाद, कुकी स्पष्ट रूप से सेट की जाती है, और मैं उपयोगकर्ता को प्राधिकरण प्रक्रिया में पुनर्निर्देशित करता हूं।

मेरे मामले में (क्योंकि मैं CakePHP का उपयोग कर रहा हूं, लेकिन इसे किसी अन्य MVC फ्रेमवर्क के साथ ठीक काम करना चाहिए) मैं लॉगिन एक्शन को फिर से बुला रहा हूं जहां एफबी प्राधिकरण को दूसरी बार निष्पादित किया जाता है, और इस बार यह मौजूदा कुकी के कारण सफल होता है।

एप्लिकेशन को एक बार अधिकृत करने के बाद, मुझे सफारी (5.1.6) के साथ ऐप का उपयोग करने में कोई समस्या नहीं है

आशा है कि किसी की मदद कर सकते हैं।


1
यह मेरे लिए काम किया !! धन्यवाद!! .. मैं सफारी 5.1.7 के साथ इस समस्या हो रही थी .... अब यह हल है!
खलिज़ार

5

मुझे iOS चलाने वाले उपकरणों पर यह समस्या थी। मैंने एक दुकान बनाई जो एक सामान्य वेबसाइट में एक iframe का उपयोग करके एम्बेड करने योग्य है। किसी तरह, हर पगेलोड पर उपयोगकर्ता को एक नया सत्रांक मिला, जिसके परिणामस्वरूप उपयोगकर्ताओं को प्रक्रिया आधी हो गई क्योंकि कुछ मान सत्र में मौजूद नहीं थे।

मैंने इस पृष्ठ पर दिए गए कुछ समाधानों की कोशिश की, लेकिन पॉपअप एक iPad पर बहुत अच्छी तरह से काम नहीं करते हैं और मुझे सबसे पारदर्शी समाधान की आवश्यकता है।

मैंने इसे पुनर्निर्देशित करके उपयोग किया। मेरी वेबसाइट को एम्बेड करने वाली वेबसाइट को पहले उपयोगकर्ता को मेरी साइट पर पुनर्निर्देशित करना होगा, इसलिए शीर्ष फ़्रेम में मेरी साइट का url शामिल है, जहां मैंने एक कुकी सेट की है और उपयोगकर्ता को मेरी साइट को एम्बेड करने वाली वेबसाइट पर उचित पृष्ठ पर पुनर्निर्देशित किया है, जो पारित हो गया है यूआरएल के माध्यम से।

उदाहरण PHP कोड

दूरस्थ वेबसाइट उपयोगकर्ता को पुनर्निर्देशित करती है

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;

उपयोगकर्ता पर समाप्त होता है http://www.domain.com/shop/frame जहां मेरी साइट एम्बेडेड है, सत्रों को स्टोर करना चाहिए जैसा कि इसे खाना चाहिए और कुकीज़ खाना चाहिए।

आशा है कि यह किसी की मदद करता है।


3

मुझे ASP.NET MVC में अपना फिक्स शेयर करने दें। मुख्य विचार जैसे PHP के लिए सही उत्तर। स्क्रिप्ट कोड के पास हेडर में मुख्य लेआउट में जोड़ा गया अगला कोड:

@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

यह समाधान कुछ मामलों में लागू होता है - यदि संभव हो तो:

यदि iframe सामग्री पृष्ठ, iframe वाले पृष्ठ के उप-डोमेन का उपयोग करता है, तो कुकी अब अवरोधित नहीं है।


यह उपयोगी जानकारी है - बस मैं क्या देख रहा था। हालांकि मुझे यकीन है कि अधिकांश लोग अपने आसपास के डोमेन नहीं बदल सकते हैं, वही मैं करने जा रहा हूं। क्या वह साइट है जिसे मैं बनाने जा रहा हूं <mycompany>। <उनका कंप्यूटर> .com उपडोमेन जो मेरे आईपी पर मैप करता है और उस डोमेन के लिए मेरी तरफ एक VHost और iFrame में उस URL का उपयोग करता है। जटिल, लेकिन बुलेटप्रूफ होना चाहिए।
एलोक्यूशन सफारी

1
यह जटिल हो सकता है यदि आप सबडोमेन के साथ https का उपयोग कर रहे हैं, क्योंकि उपडोमेन सर्वर को मिलान के लिए एसएसएल प्रमाणपत्र की आवश्यकता होगी।
रोजर हॉलिबर्टन

1

Google ने वास्तव में इस पर बिल्ली को बैग से बाहर कर दिया। ट्रैकिंग कुकीज़ तक पहुँचने के लिए वे कुछ समय के लिए इसका इस्तेमाल कर रहे थे। यह लगभग तुरंत Apple = \ द्वारा तय किया गया था

मूल वॉल स्ट्रीट जर्नल पोस्ट


मैं Google चीज़ के बारे में जानता हूं, लेकिन मैंने Apple के बारे में वास्तव में कुछ भी नहीं देखा है। क्या आपके पास उस पर कोई विवरण है?
मिस्चा

1

यहाँ कुछ कोड है जो मैं उपयोग करता हूं। मैंने पाया कि यदि मैं अपनी साइट से कोई कुकी सेट करता हूं, तो कुकीज़ जादुई रूप से उस समय से इफ्रेम में काम करती हैं।

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 में थोड़ा सा सिम्पर वर्जन:

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

मुझे इसका सही उत्तर मिल गया है, एलन नाम के एक लड़के को धन्यवाद, जो यहाँ के सभी श्रेय का हकदार है। ( http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/ )

उसका समाधान सरल और समझने में आसान है।

Iframe कंटेंट सर्वर (डोमेन 2) पर, स्टार्ट डोमेन नामक एक फाइल जोड़ें , जिसमें रूट डोमेन स्तर शामिल हो:

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

अब iframe (domain1) वाले शीर्ष स्तर की वेबसाइट पर, iframe वाले पृष्ठ पर कॉल इस तरह दिखना चाहिए:

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

और बस! सिम :)

यह काम करता है क्योंकि आप ब्राउज़र को किसी तीसरे पक्ष के URL पर निर्देशित कर रहे हैं और इस तरह से iframe के भीतर से सामग्री दिखाने से पहले उस पर भरोसा करने के लिए कह रहे हैं।


0

मैंने संशोधित किया (लिंक पर हस्ताक्षर किए गए_रेक्वेस्ट परम को जोड़ा) व्हिटियाल की चाल और यह सफारी के लिए ठीक काम किया, लेकिन IE लगातार उस मामले में पृष्ठ को ताज़ा कर रहा है। तो सफारी और इंटरनेट एक्सप्लोरर के लिए मेरा समाधान है:

$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

मैं भी इस समस्या से पीड़ित रहा हूं, लेकिन आखिरकार समाधान मिल गया, शुरू में सीधे ब्राउज़र में iframe url को छोटे पॉपअप की तरह लोड करें, इसके बाद iframe के अंदर सत्र मानों को एक्सेस करें।


-1

मैंने हाल ही में सफारी पर इसी मुद्दे को मारा। मैंने जो समाधान निकाला, वह स्थानीय संग्रहण एचटीएमएल 5 एपीआई पर आधारित है। स्थानीय संग्रहण का उपयोग करके आप कुकीज़ का अनुकरण कर सकते हैं।

यहाँ विवरण के साथ मेरा ब्लॉग पोस्ट है: http://log.scalemotion.com/2012/10/how-to-trick-safari-and-set-3rd-party.html


बुनाई से स्नैपशॉट: web.archive.org/web/20121124020234/http://log.scalemotion.com/…
podvzbzdnul

-2

मैंने $_SESSIONसभी को एक साथ चर से छुटकारा पाने का फैसला किया और सत्र की नकल करने के लिए मेम्चे के चारों ओर एक आवरण लिखा।

जाँच Https://github.com/manpreetssethi/utils/blob/master/Session_manager.php करें

उपयोग-मामला: ऐप पर एक उपयोगकर्ता भूमि, Session_manager का उपयोग करके हस्ताक्षरित अनुरोध को संग्रहीत करता है और चूंकि यह कैश में है, इसलिए आप इसे किसी भी पृष्ठ पर एक्सेस कर सकते हैं।

नोट: जब सत्र re_s पृष्ठ पुनः लोड होता है, तो हर बार सफारी में निजी तौर पर ब्राउज़ करते समय यह काम नहीं करेगा। (बेवकूफ सफारी)


-9

आप शीर्षलेख को p3p नीति के रूप में जोड़कर इस समस्या को हल कर सकते हैं..मैं सफारी पर एक ही मुद्दा था इसलिए फ़ाइलों के शीर्ष पर शीर्षलेख जोड़ने के बाद मेरी समस्या हल हो गई है।

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

क्या आप सुनिश्चित हैं कि यह (अभी भी) सफारी के नवीनतम संस्करण के साथ काम करता है? आईई के लिए हमारे पास वर्षों से पी 3 पी हेडर हैं, लेकिन सफारी अभी भी टूटी हुई है।
मिस्चा

2
अपने सभी कुकी साफ़ करने का प्रयास करें और फिर से परीक्षण करें। यदि आपका ब्राउज़र पहले से ही आपके iframed साइट के लिए कुकीज़ है, तो समस्या खुद को नहीं दिखाती है।
rmarscher

हम्म, मुझे या तो काम करने के लिए P3P हेडर नहीं मिल सकता है। वे अभी भी IE में काम करते हैं!
सेठ ब्राउन

2
यह काम करता था। लेकिन सफारी के सबसे हालिया संस्करण के लिए यह नहीं है। अपना कैश साफ़ करें और इसे फिर से
आज़माएँ

2
मैं बताना चाहता हूं कि यह समाधान काम करता है। सुनिश्चित करें कि आप सफारी पर सभी कुकीज़ प्राप्त करें। और फिर यह प्रयास करें।
dnuske
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.