2012-01-21 15 views
8

मैंने यहां कुछ संबंधित पोस्ट पढ़ी हैं, लेकिन ऐसा लगता है कि मेरी स्क्रिप्ट को इरादे से काम नहीं कर पा रहा है।PHP सत्र और iframe

मेरे पास एक लॉगिन पृष्ठ है जहां कोई उपयोगकर्ता लॉग इन करता है। यदि पासवर्ड मेल खाता है, तो स्क्रिप्ट $_SESSION चर में दो मान लिखती है: ['loggedin']='yes' और ['loginname']="username"

सफल लॉग इन के बाद, उपयोगकर्ता दूसरे पृष्ठ पर जाता है जिसमें 2 iframes हैं।

एक आईफ़्रेम बाहरी सामग्री का उपयोग करता है और प्रमाणीकरण की आवश्यकता नहीं होती है (पृष्ठ से इस आईफ़्रेम को हटाने से कुछ भी नहीं बदला जाता है)।

अन्य iframe उसी डोमेन से गतिशील रूप से जेनरेट की गई सामग्री का उपयोग करता है और यह जांचता है कि सत्र चर अभी भी हैं या नहीं।

कार्यों में से एक उस गतिशील रूप से जेनरेट किए गए आईफ्रेम की सामग्री को रीफ्रेश करता है।

एक बार ऐसा करने के बाद, सत्र चर खो जाते हैं। वास्तव में, सत्र स्वयं मौजूद नहीं है।

मेरे पास इस पृष्ठ के संबंध में उपयोग किए जाने वाले प्रत्येक पृष्ठ पर session_start(); है।

किसी भी मदद की सराहना की जाएगी।

+0

यदि आपके पास iframes पृष्ठ पर session_start() है, तो आपको कोई समस्या नहीं होनी चाहिए। – Chibuzo

+0

मुझे कुकी-आधारित सत्रों में समस्या आई है जो मेरे आईफ्रेम में काम नहीं कर रहा है। ऐसा इसलिए था क्योंकि जिस ब्राउज़र के साथ मैं परीक्षण कर रहा था वह ** तृतीय पक्ष कुकीज़ ** अक्षम था। –

उत्तर

4

फ्रेम में अपने प्रत्येक पृष्ठ के लिए निम्न जोड़ें:

echo "Session ID: ".session_id();

यह चाहिए प्रत्येक पृष्ठ पर उत्पादन सत्र आईडी। यह संभव है कि एक नया सत्र शायद फ्रेम में से किसी एक पर उत्पन्न हो रहा हो, ऊपर की जांच करके आप इस संभावना को रद्द कर सकते हैं।

+0

ठीक है, मैंने उस पंक्ति को जोड़ा, और नतीजा मुझे रोक देता है। Session_id समान है, लेकिन किसी भी तरह स्क्रिप्ट अगर ($ _SESSION) स्थिति विफल हो जाती है। तो मेरे पास यह कोड है: 'अगर (! $ _ सत्र) {echo "कोई सत्र नहीं"; echo session_id(); } '। हैरानी की बात है कि मुझे निम्न आउटपुट मिलता है: "कोई सत्र सत्र आईडी: 2c49b03084d3a5112e332e0d53008650" सामान्य परिस्थितियों में, "कोई सत्र" कोड उपयोगकर्ता को ऑथ स्टेज पर वापस ट्रिगर करता है। यह कैसे संभव है कि $ _SESSION var खाली है लेकिन अभी भी सत्र आईडी है? –

+1

'if (! Isset ($ _ सत्र)) ' –

+0

वाह, यह शर्मनाक है। जारी करने की स्थिति तय की। लेकिन मुझे अभी भी गायब होने वाले चर की समस्या है, क्योंकि अब यह दूसरी स्थिति में विफल रहता है: 'अगर (($ _SESSION [' AdminLoggedIn ']! = "हाँ") || ($ _SESSION [' AdminName '] == "")) {' –

16

मेरा मानना ​​है कि इस article'll उपयोगी हो: http://www.how2guru.com/archives/php-session-problem-while-using-iframe/

संक्षिप्त उत्तर है:

header('P3P: CP="CAO PSA OUR"'); 
session_start(); 

संपादित करें:

सोचा iframe में, इस तरह सत्र शुरू मुझे यह जवाब अपडेट करना चाहिए, क्योंकि मैंने कुछ रोचक चीज़ों पर ठोकर खाई है, जिसे हर किसी को पता होना चाहिए।

यह पी 3 पी हेडर हैक सफारी पर काम नहीं करता है।

नीचे मैं अपने लॉगिन प्रवाह का वर्णन करता हूं, और मैंने इस समस्या को कैसे हल किया।

मेरे प्रवेश प्रवाह को इस (पेज एप्लिकेशन) की तरह दिखता है:

  • पता चल सके कि वर्तमान उपयोगकर्ता एक सत्र है,
  • यदि नहीं, तो लॉगिन यूआरएल (PHP एसडीके द्वारा उत्पन्न) को अनुप्रेषित,
  • लॉगिन संवाद एक यूआरएल पर वापस रीडायरेक्ट करता है, जहां मैं 'कोड' जीईटी पैरामीटर फेसबुक का उपयोग करता हूं, मुझे एक्सेस टोकन प्राप्त करने के लिए देता है, जिसे मैं बाद में उपयोग के लिए स्टोर कर सकता हूं। (सत्र में डीबी और पर सहेजा जा रहा है।) यदि मैं इसके साथ कर रहा हूं, तो मैं उपयोगकर्ता को अपने पेज ऐप पर रीडायरेक्ट करता हूं, जहां सबकुछ काम करेगा।
  • हर किसी को इस बिंदु पर खुश होना चाहिए।

लेकिन यहां गॉचा आता है।

एक उपयोगकर्ता सफारी का उपयोग करता है, और इस एप्लिकेशन को जब सत्र पहले से ही नष्ट कर दिया गया (। कुछ दिनों के बाद पूर्व के लिए) खोलने के लिए कोशिश करता है, तो निम्न बात क्या होगा: एक सत्र के लिए

  • कोड चेकों : यह उपयोगकर्ता आईडी (PHP एसडीके getUser() विधि) पाता है, इसलिए मैं पहले डेटाबेस में एक प्रविष्टि की जांच करता हूं।
  • चूंकि उपयोगकर्ता पहले से लॉग इन हुआ था, उसके पास डेटाबेस में एक प्रविष्टि है, इसलिए मैं इसे अभी पकड़ता हूं और इसे एक सत्र में सहेजता हूं, ताकि भविष्य में AJAX कॉल की सभी आवश्यक जानकारी हो।

यहां ध्यान देने योग्य महत्वपूर्ण बात यह है कि यह कोड किसी आईफ़्रेम के भीतर एक पृष्ठ टैब में चलता है।

तो अधिकांश उपयोगकर्ताओं के लिए कोड काम करेगा, पी 3 पी हेडर हैक की वजह से कोड काम करेगा।

लेकिन सफारी उपयोगकर्ताओं के लिए यह नहीं होगा।

सफारी दिए गए शीर्षलेख की परवाह नहीं करता है, यह सत्र को सहेजने से इंकार कर देता है, इसलिए उपयोगकर्ता ऐप में लॉग इन करता है, सबकुछ ठीक काम करता प्रतीत होता है, लेकिन AJAX कॉल काम नहीं करेंगे, क्योंकि वे ' के साथ काम करने के लिए कोई सत्र नहीं है।

वैकल्पिक हल:

काफी वास्तव में सरल - हालांकि बहुत सुंदर नहीं है, लेकिन हे, यह काम करता है। -: मैं जांचता हूं कि क्लाइंट ब्राउज़र सफारी है या नहीं, और यदि ऐसा है, तो मैं एक कस्टम यूआरएल पर रीडायरेक्ट करता हूं, जहां मैं सत्र शुरू करता हूं - फेसबुक iframe के बाहर - फिर ऐप पर रीडायरेक्ट करें।

यह बिना किसी समस्या के कुकी बना देगा, इसलिए सत्र उपलब्ध होंगे।

  • सत्र (Credit goes to this guy)

    if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) { 
        if (count($_COOKIE) === 0) { 
        echo '<script> 
        top.location = "http://www.domain.com/setcookie.php"; 
        </script>'; 
        } 
    } 
    
  • सत्र की स्थापना (setcookie.php)

    header('P3P: CP="CAO PSA OUR"'); 
    session_start(); 
    $_SESSION = array(); 
    
    echo 
    '<script> 
    top.location = "http://back-to-the-facebook-app.com"; 
    </script>'; 
    
जाँच हो रही है:

यहाँ कुछ कोड है

मुझे आशा है कि यह अतिरिक्त चाल किसी की मदद करेगी।

EDIT2

मैं अभी तक इस एक बाहर की कोशिश नहीं की, लेकिन इसके बजाय पी 3 पी हेडर को जोड़े की, तो आप सिर्फ अपने लिए निम्नलिखित लाइनों जोड़ सकते हैं।इनको:

<IfModule mod_headers.c> 
    Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" 
</IfModule> 
टिप्पणियों के साथ

:

# ------------------------------------------------------------------------------ 
# | Cookie setting from iframes            | 
# ------------------------------------------------------------------------------ 

# Allow cookies to be set from iframes in IE. 
# http://msdn.microsoft.com/en-us/library/ms537343.aspx 
# http://www.w3.org/TR/2000/CR-P3P-20001215/ 

<IfModule mod_headers.c> 
    Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" 
</IfModule> 

सभी क्रेडिट इस Yeoman परियोजना के पीछे लोगों के लिए कोड .htacces के लिए चला जाता है।

+1

http/server/location block में nginx के लिए add_header P3P 'policyref = "/ w3c/p3p.xml", CP = " आईडीसी डीएसपी सीओआर एडीएम देवी ताई पीएसए PSD आईवीएआई आईवीडीआई कोंई उनका हमारा भारतीय सीएनटी ", सीपी =" सीएओ पीएसए हमारा "; –

+0

शाऊलियस - क्या यह काम सफारी के लिए भी होना चाहिए? मेरे लिए यह मदद नहीं कर रहा है या मैं कुछ गलत करता हूँ –

संबंधित मुद्दे