क्या AJAX अनुरोध PHP सत्र जानकारी को बनाए रखते हैं?


154

यदि मैं एक उपयोगकर्ता था जो मेरी साइट पर लॉग इन करता था, तो उसकी आईडी संग्रहीत की जाती थी $_SESSIONऔर अपने ब्राउज़र से उसने एक 'सेव' बटन पर क्लिक किया, जो सर्वर को AJAX का अनुरोध करेगा। क्या $_SESSIONइस अनुरोध में उनकी और कुकीज़ को बरकरार रखा जाएगा, और क्या मैं सुरक्षित रूप से आईडी में मौजूद होने पर भरोसा कर सकता हूं $_SESSION?

जवाबों:


191

इसका जवाब है हाँ:

सत्र सर्वर-साइड बनाए रखा जाता है। जहां तक ​​सर्वर का सवाल है, AJAX अनुरोध और एक नियमित पेज अनुरोध के बीच कोई अंतर नहीं है। वे दोनों HTTP अनुरोध हैं, और वे दोनों एक ही तरह से शीर्ष लेख में कुकी जानकारी रखते हैं।

क्लाइंट की ओर से, एक ही कुकीज़ को हमेशा सर्वर पर भेजा जाएगा चाहे वह नियमित अनुरोध हो या AJAX अनुरोध। जावास्क्रिप्ट कोड को कुछ विशेष करने की आवश्यकता नहीं है या यहां तक ​​कि इस होने के बारे में पता करने के लिए, यह ठीक उसी तरह काम करता है जैसे कि यह नियमित अनुरोधों के साथ करता है।


10
फॉलोअप: HttpOnlyकुकी को सेट करते समय सर्वर एक ध्वज सेट कर सकता है जिसका अर्थ है कि आपका जावास्क्रिप्ट कुकी को देखने में सक्षम नहीं होगा। हालाँकि कुकी को अभी भी AJAX और नियमित पेज अनुरोध दोनों के लिए भेजा जाएगा और ठीक उसी तरह काम करना जारी रहेगा। आपकी जावास्क्रिप्ट अभी इसमें दिखाई नहीं देगी document.cookie
थोमसट्रेटर

यदि PHP त्रुटि रिपोर्टिंग चालू है, तो आप AJAX प्रतिक्रिया के साथ एक सत्र त्रुटि प्राप्त कर सकते हैं। मैं Warning: session_write_close(): Failed to write session data (user)हाल ही में एक परियोजना में हाल ही में एक त्रुटि हो रही है , लेकिन केवल जब AJAX अनुरोध शेष पृष्ठ के लोडिंग के दौरान होता है। मैं सत्र डेटा के लिए MySQL DB का उपयोग कर रहा हूं, और यह संभव है कि मुख्य पृष्ठ अनुरोध उस तालिका को लॉक कर रहा है, जिससे AJAX अनुरोध को एक्सेस करने से रोका जा सके।
ब्यूटल बस्कस

@ButtleButkus जो आपके सर्वर साइड कोड में एक समस्या की तरह लगता है और मुझे यकीन है कि यदि आप इसे अपने प्रश्न के रूप में सबमिट करते हैं तो लोग मदद करने के लिए तैयार होंगे। सिर्फ इसलिए कि आप सत्र यह एक तरीका है कि एक त्रुटि के साथ विफल हो जाएगा में बंद नहीं किया जाना चाहिए के रूप में के लिए MySQL का उपयोग कर रहे आप उस त्रुटि प्राप्त नहीं हो जाना चाहिए। यह MySQL कनेक्शन के संतृप्त होने, या कुछ अन्य असंबंधित मुद्दे के साथ एक समस्या हो सकती है।
thomasrutter

यह एक योनि मशीन पर हो रहा है इसलिए MySQL कनेक्शन को संतृप्त किया जाना चाहिए। अगर मैं जल्द ही इसका पता नहीं लगा पाया तो एक सवाल जरूर लिखूंगा।
बटल Butkus

23

यदि PHP फ़ाइल AJAX अनुरोधों में session_start()सत्र की जानकारी रखी जाएगी। (अनुरोधों को रोकना एक ही डोमेन के भीतर है)


2
वास्तव में, यह कि मैं क्या करना भूल गया :-)
सिवनी

23

क्या तुम सच में हो रही है: कुकीज़ AJAX अनुरोध के साथ भेजा जाता है? AJAX के अनुरोध को एक ही डोमेन (या कुकी की डोमेन बाधाओं के भीतर) मानकर, इसका उत्तर हां है। तो AJAX वापस उसी सर्वर पर अनुरोध करता है जो सत्र की जानकारी तक पहुँचने के लिए किसी भी अन्य PHP स्क्रिप्ट के अनुसार एक ही सत्र की जानकारी (तथाकथित लिपियों को एक सत्र_स्टार्ट () जारी करते हुए) बनाए रखता है।


1
मैं गलत हो सकता हूं, लेकिन मुझे लगा कि अन्य डोमेन (उप डोमेन) को अजाक्स अनुरोध पोस्ट करना भी संभव नहीं था?
एमिल एच

आप गतिशील स्क्रिप्ट चाल के साथ धोखा देने के लिए सक्षम हो सकता है। हालांकि यह कभी नहीं थका।
cletus

1
हां, अन्य अनुरोध अन्य डोमेन के लिए नहीं किए जा सकते। लेकिन अगर आप गतिशील रूप से पेज में एक <script> टैग डालें और एक ऑफ डोमेन यूआरएल के लिए अपने स्रोत सेट कर सकते हैं कि जावास्क्रिप्ट बाहर गूँज।
क्लिक करें

1
अजाक्स अनुरोध अन्य डोमेन के लिए नहीं किया जा सकता है। लेकिन आप अपने php कोड में एक प्रॉक्सी बना सकता है। प्रॉक्सी के लिए ajax अनुरोध, अन्य डोमेन के लिए प्रॉक्सी अनुरोध।
पीटर लांग

2
बस एक नोट ... ajax अनुरोधों को क्रॉस-डोमेन बनाया जा सकता है, लेकिन केवल अगर प्रतिक्रिया प्रकार jsonp है। मेरे द्वारा हमेशा ऐसा ही किया जाता है।
एपिफेनी

8

खैर, हमेशा नहीं। कुकीज़ का उपयोग करना, आप अच्छे हैं। लेकिन "क्या मैं सुरक्षित रूप से आईडी के मौजूद होने पर भरोसा कर सकता हूं" ने मुझे एक महत्वपूर्ण बिंदु के साथ चर्चा का विस्तार करने का आग्रह किया (ज्यादातर संदर्भ के लिए, क्योंकि इस पृष्ठ की आगंतुक गणना काफी अधिक लगती है)।

कुकी के बजाय URL को URL-पुनर्लेखन द्वारा सत्र बनाए रखने के लिए कॉन्फ़िगर किया जा सकता है। ( यह कैसे अच्छा है या बुरा है (<- देखें कि वहां सबसे ऊपर की टिप्पणी) एक अलग सवाल है , चलो अब वर्तमान में चिपके रहते हैं, सिर्फ एक साइड-नोट के साथ: URL- आधारित सत्रों के साथ सबसे प्रमुख मुद्दा - धुंधला , अगर यह अजाक्स के लिए चालू है, यह भी साइट के आराम के लिए चालू है, इसलिए वहाँ लेकिन फिर ...); - नग्न सत्र आईडी की दृश्यता नहीं आंतरिक अजाक्स कॉल के साथ एक मुद्दा है

URL-पुनर्लेखन (कुकरैल) सत्रों के मामले में, अजाक्स कॉल को स्वयं यह ध्यान रखना चाहिए कि उनके अनुरोध URL ठीक से तैयार किए गए हैं। (या आप अपने स्वयं के कस्टम समाधान को रोल कर सकते हैं। आप कम मांग वाले मामलों में भी ग्राहक पक्ष पर सत्रों को बनाए रखने का सहारा ले सकते हैं ।) सत्र निरंतरता के लिए आवश्यक स्पष्ट देखभाल है , यदि कुकीज़ का उपयोग नहीं किया जाता है:

  1. अजाक्स सिर्फ कॉल करता है निकालने (उम्म, cookified) यूआरएल (PHP से प्राप्त के रूप में) HTML से शब्दशः, कि ठीक है, के रूप में वे पहले से ही पकाया जाता है होना चाहिए।

  2. यदि उन्हें स्वयं URI के अनुरोध को इकट्ठा करने की आवश्यकता है , तो सत्र ID को URL से मैन्युअल रूप से जोड़ना होगा। (चेक यहाँ पीएचपी द्वारा उत्पन्न पेज स्रोतों (या पर URL को फिर से लिखने के साथ ) इसे कैसे करना देखने के लिए।)


से OWASP.org :

प्रभावी रूप से, वेब एप्लिकेशन तंत्र, कुकीज़ या URL दोनों मापदंडों का उपयोग कर सकता है, या यहां तक ​​कि एक से दूसरे में स्विच कर सकता है (स्वचालित URL पुनर्लेखन) यदि कुछ शर्तें पूरी होती हैं (उदाहरण के लिए, कुकीज़ का समर्थन किए बिना वेब क्लाइंट का अस्तित्व या जब कुकीज़ नहीं हैं उपयोगकर्ता गोपनीयता चिंताओं के कारण स्वीकार किए जाते हैं)।

एक से रूबी-मंच पोस्ट:

कुकीज़ के साथ php का उपयोग करते समय, सत्र आईडी स्वचालित रूप से Ajax XMLHttpRequests के लिए अनुरोध हेडर में भी भेजा जाएगा। यदि आप URL-आधारित php सत्रों का उपयोग या अनुमति देते हैं, तो आपको सत्र आईडी को प्रत्येक Ajax अनुरोध url में जोड़ना होगा।


कितने लोग सत्र कुकीज़ को अक्षम कर चुके हैं, इस पर कोई विश्वसनीय आँकड़े ? (मैं कोई भी खोजने में विफल रहा। केवल जावास्क्रिप्ट पर: जो कि यूएस / यूरोप में लगभग 2% और ~ 1.2% दुनिया में लगता है।)
Sz

URL पर सत्र आईडी एक पुराना, असुरक्षित अभ्यास है। आज के वेब पर, किसी को यह नहीं मानना ​​चाहिए कि वे कुकीज़ से अक्षम हो सकते हैं और फिर भी उन वेब साइटों पर लॉग इन कर सकते हैं जहां वे खाता रखते हैं। यदि आपके किसी विज़िटर ने कुकीज़ को निष्क्रिय कर दिया है, तो यह मान लेना सुरक्षित है कि या तो क) वे विशेष रूप से गोपनीयता कारणों से किसी भी साइट पर साइन इन करने में सक्षम नहीं होना चाहते हैं; या b) उन्होंने इसे गलती से किया था, और अब वे किसी भी साइट पर लॉग इन नहीं कर सकते हैं , न कि केवल आपका।
थोमसट्रेटर

3

यह बहुत महत्वपूर्ण है कि AJAX अनुरोध सत्र को बनाए रखे। सबसे आसान उदाहरण है जब आप व्यवस्थापक पैनल के लिए AJAX अनुरोध करने की कोशिश करते हैं, तो हम कहते हैं। बेशक, आप उस पेज की रक्षा करेंगे जो आप अनुरोध करते हैं, न कि उन लोगों द्वारा पहुंच योग्य है जिनके पास व्यवस्थापक लॉगिन के बाद मिलने वाला सत्र नहीं है। समझ में आता है?


0

यद्यपि देखने के लिए एक बात, विशेष रूप से यदि आप एक रूपरेखा का उपयोग कर रहे हैं, तो यह देखना है कि क्या एप्लिकेशन अनुरोधों के बीच सत्र आईडी पुनर्जीवित कर रहा है - कुछ भी जो सत्र आईडी पर स्पष्ट रूप से निर्भर करता है, समस्याओं में चलेगा, हालांकि स्पष्ट रूप से बाकी डेटा में सत्र अप्रभावित रहेगा।

यदि आवेदन इस तरह से सत्र आईडी पुनर्जीवित कर रहा है, तो आप ऐसी स्थिति के साथ समाप्त हो सकते हैं जहां प्रभाव में अजाक्स अनुरोध अनुरोध आईडी में सत्र आईडी को अमान्य / बदल देता है।


0

यही कारण है कि फ्रेमवर्क करते हैं, उदाहरण के लिए यदि आप फ्रंट कंट्रोलर या सेस्ट्रैप स्क्रिप्ट में सत्र को इनिशियलाइज़ करते हैं, तो आपको पेज कंट्रोलर या अजाक्स कंट्रोलर्स के लिए इनरलाइज़ेशन की परवाह नहीं करनी होगी। PHP चौखटे रामबाण नहीं हैं, लेकिन वे इस तरह की कई उपयोगी चीजें करते हैं!


0

अपना सत्र () सभी सर्वर साइड पेजों में अंकित करें, जो एक अजाक्स अनुरोध को स्वीकार करता है:

if(require_once("auth.php")) {

//run json code

}

// do nothing otherwise

मेरे द्वारा किए गए एकमात्र तरीके के बारे में।

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