Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP सत्र AJAX के साथ संघर्ष करता है

अगर मैं इसे सही ढंग से समझता हूं, तो ऐसा लगता है कि आप प्रत्येक अनुरोध के लिए टोकन सेट कर रहे हैं। मेरा अनुमान है कि पुराने पृष्ठ में अभी भी पुराना टोकन है। मैं यह देखने के लिए जांच करूंगा कि टोकन को स्वचालित रूप से उड़ाने से पहले सेट किया गया है या नहीं।

 if (isset($_SESSION['token'])){
    //do nothing
 } else{
   $_SESSION['token'] = md5(rand());
 }

संपादित करें अपने प्रश्न का समाधान करने के लिए।

"टोकन" की केवल एक कुंजी का उपयोग करने के बजाय, प्रत्येक ब्राउज़र सत्र के लिए एक कुंजी बनाएं।

$_SESSION[$sessionId] = md5(rand());

चाल, निश्चित रूप से पता चल जाएगी कि ऐसा कब होता है क्योंकि यदि आप सत्र का उपयोग नहीं कर सकते हैं, तो आप वास्तव में नहीं जान पाएंगे कि अनुरोध नए टैब से आ रहा है या पुराने से। आप इस पैरामीटर को पास करने के लिए क्वेरी स्ट्रिंग का उपयोग कर सकते हैं। मूल रूप से सभी अनुरोधों में यह पैरामीटर होना चाहिए अन्यथा आप उनके साथ सत्र को संबद्ध नहीं करते हैं।

उदा.

http://www.yoursite.com/somepage.php?sessionid=<some generated id>

अंततः, उपयोगकर्ता इसके साथ बंदर कर सकता है लेकिन मुझे यकीन नहीं है कि इसके आसपास कोई रास्ता है।

2 संपादित करें ठीक है, यह मेरा विचार है कि आपको यह कैसे करना चाहिए। सुरक्षा विशेषज्ञ, अगर मेरे पास यह गलत है तो मुझे आग लगाने के लिए स्वतंत्र महसूस करें, जैसा कि मैंने पहले कहा था कि मैं कोई विशेषज्ञ नहीं हूं, लेकिन ऐसा नहीं लगता कि मैं कुछ सुझाव दिए बिना इससे बाहर निकलने जा रहा हूं;-)

सीएसएफआर के साथ समस्या यह है कि कुछ दुर्भावनापूर्ण उपयोगकर्ता, बॉब, किसी अन्य साइट पर एक तत्व बना सकते हैं जो ऐलिस के ब्राउज़र को किसी अन्य साइट के लिए अनुरोध करने का कारण बनता है और क्योंकि ऐलिस ने पहले लॉग इन किया था और वह जानकारी कुकी या ऐलिस के रूप में संग्रहीत की जाती है। सत्र के माध्यम से पहचाना जाता है, साइट अनुरोध को निष्पादित करती है जैसे कि ऐलिस ने इसका अनुरोध किया था। उदाहरण के लिए, अगर ऐलिस का बैंक http://www.mybank.com है , तो बॉब एक ​​फ़ोरम पोस्ट बना सकता है जिसमें

<img srg="http://www.mybank.com/transferfunds.php?amount=1000&receiver=Bob" />

ऐलिस का बैंक उसके ब्राउज़र को अनुरोध करने के रूप में पहचान लेगा, यह सोचकर कि यह उसका है। इसे एक व्यवहार्य हमला बनाने के लिए कुछ महत्वपूर्ण चीजें होनी हैं (एक साथ, इनमें से कोई भी विफलता हमले को विफल कर देगी) (ये इसे रोकने के तरीके को समझने के लिए महत्वपूर्ण हैं):

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

स्टेटलेस प्रोटोकॉल (HTTP) के शीर्ष पर "राज्य" की कुछ धारणा प्रदान करने के लिए, आप वास्तव में (1) में जोखिम के आसपास नहीं जा सकते। जब तक आप लोगों को हमेशा "लॉग आउट" पर क्लिक करने या उनकी विंडो आदि बंद करने के लिए नहीं कहते हैं, तब तक आप ब्राउज़र या सत्र में जानकारी संग्रहीत करने के लिए कुछ भी नहीं कर सकते हैं। हालाँकि, आप (2) को समस्या होने से बचा सकते हैं। इसका मेरा समाधान (और मुझे यकीन है कि कई अन्य हैं) हैश उत्पन्न करना है, जैसे आप कर रहे हैं और इसे सत्र में स्टोर कर रहे हैं।

उदाहरण के लिए,

$_SESSION['token'] = md5(rand());

फिर, आप जो करते हैं वह उस टोकन को आपके सभी आंतरिक लिंक में जोड़ देता है।

http://www.mysite.com/secure.php?token=giuwnrefviunslfghahgliuwnvwrgbaasd ए>

आप कभी नहीं उस टोकन को ब्राउज़र मेमोरी में स्टोर करें:यानी एक कुकी। जब अनुरोध किया जाता है, तो कुछ भी करने से पहले, आप टोकन की जांच करते हैं

//note, you'll want to sanitize user input, I'm just being brief
if ($_GET['token'] != $_SESSION['token']){
   //User either attempted to enter a link on their own or it's a CSRF attack
   header('HTTP/1.1 403 Forbidden');
 }else{
 //do whatever needs to be done
 }

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

टोकन के लिए टाइमआउट निर्दिष्ट करने की कोई आवश्यकता नहीं है क्योंकि ब्राउज़र बंद होने पर टोकन को मिटा दिया जाएगा और जब उपयोगकर्ता साइट पर जाता है तो उसे पुन:उत्पन्न करने की आवश्यकता होती है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्ट्रीक MySQL क्वेरी में भाग लेना

  2. Amazon DynamoDB - दोस्ती के आधार पर टेबल डिजाइन करना

  3. यूआरएल से डोमेन निकालने के लिए मैसकल क्वेरी

  4. InnoDB/MyISAM रिकॉर्ड डालने के लिए आवश्यक समय में अंतर

  5. पोस्टग्रेज में JSON कॉलम में एंट्री डालना