शब्दावली
- उपयोगकर्ता: एक आगंतुक।
- ग्राहक: किसी विशेष मशीन पर स्थापित एक विशेष वेब-सक्षम सॉफ़्टवेयर।
समझौता सत्र
आदेश में समझने के लिए कैसे अपने सत्र सुरक्षित बनाने के लिए, आपको पहले समझना चाहिए कैसे सत्र काम करते हैं।
के कोड के इस टुकड़े देखते हैं:
session_start();
जैसे ही आप फोन है कि, पीएचपी एक कुकी (डिफ़ॉल्ट रूप से) PHPSESSID
कहा जाता है के लिए दिखेगा। यदि यह नहीं पाया जाता है, यह बना दिया जाएगा:
PHPSESSID=h8p6eoh3djplmnum2f696e4vq3
यदि यह पाया जाता है, यह PHPSESSID
का मूल्य लेता है और फिर इसी सत्र लोड करता है। उस मान को session_id
कहा जाता है।
यही एकमात्र चीज है जिसे ग्राहक पता चलेगा। जो भी आप सत्र चर में जोड़ते हैं वह सर्वर पर रहता है, और क्लाइंट को कभी भी स्थानांतरित नहीं किया जाता है। यदि आप $_SESSION
की सामग्री बदलते हैं तो वह चर बदलता नहीं है। जब तक आप इसे नष्ट नहीं करते हैं या यह समय समाप्त होता है तब तक यह हमेशा रहता है। इसलिए, यह $_SESSION
की सामग्री को खराब करने की कोशिश करने के लिए बेकार है या अन्य माध्यमों से ग्राहक को उस जानकारी को कभी प्राप्त या भेजता नहीं है।
फिर, एक नया सत्र के मामले में, आप चर सेट हो जाएगा:
$_SESSION['user'] = 'someuser';
ग्राहक है कि जानकारी कभी नहीं देखेंगे।
समस्या
एक सुरक्षा समस्या उत्पन्न हो सकती है जब एक दुर्भावनापूर्ण उपयोगकर्ता एक अन्य उपयोगकर्ता के session_id
चुरा लेता है। किसी प्रकार की जांच के बिना, वह उस उपयोगकर्ता का प्रतिरूपण करने के लिए स्वतंत्र होगा। हमें क्लाइंट की पहचान करने के लिए एक रास्ता खोजने की जरूरत है (उपयोगकर्ता नहीं)।
एक रणनीति (सबसे प्रभावी) में यह जांचना शामिल है कि सत्र शुरू करने वाले क्लाइंट का आईपी सत्र का उपयोग कर व्यक्ति के आईपी जैसा ही है।
if(logging_in()) {
$_SESSION['user'] = 'someuser';
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
// The Check on subsequent load
if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
die('Session MAY have been hijacked');
}
कि रणनीति के साथ समस्या यह है कि एक ग्राहक (लंबी अवधि के सत्र पर) एक लोड संतुलन, या का उपयोग करता है, तो उपयोगकर्ता एक गतिशील आईपी है, यह एक झूठी चेतावनी ट्रिगर किया जाएगा है।
एक और रणनीति ग्राहक के उपयोगकर्ता एजेंट की जाँच शामिल है:
if(logging_in()) {
$_SESSION['user'] = 'someuser';
$_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT'];
}
// The Check on subsequent load
if($_SESSION['agent'] != $_SERVER['HTTP_USER_AGENT']) {
die('Session MAY have been hijacked');
}
कि रणनीति के नकारात्मक पक्ष यह है कि अगर ग्राहक उन्नयन यह ब्राउज़र है या कोई एडऑन (कुछ उपयोगकर्ता-एजेंट के कहते हैं) को स्थापित करता है, उपयोगकर्ता-एजेंट स्ट्रिंग बदल जाएगी और यह एक झूठी चेतावनी ट्रिगर करेगा।
एक और रणनीति प्रत्येक 5 अनुरोधों पर session_id
को घुमाने के लिए है। इस तरह, session_id
सैद्धांतिक रूप से अपहृत होने के लिए पर्याप्त समय तक नहीं रहता है।
if(logging_in()) {
$_SESSION['user'] = 'someuser';
$_SESSION['count'] = 5;
}
// The Check on subsequent load
if(($_SESSION['count'] -= 1) == 0) {
session_regenerate_id();
$_SESSION['count'] = 5;
}
आप इन रणनीतियों में से प्रत्येक को अपनी इच्छानुसार जोड़ सकते हैं, लेकिन आप डाउनसाइड्स को भी जोड़ देंगे।
दुर्भाग्यवश, कोई समाधान मूर्ख-प्रमाण नहीं है। यदि आपका session_id
समझौता किया गया है, तो आप इसके लिए काफी कुछ कर रहे हैं। उपर्युक्त रणनीतियों केवल स्टॉप-गैप उपायों हैं।
कूल। मुझे लगता है कि आपकी विधि सबसे अच्छी तरह से काम करती है, इसमें कोई संदेह नहीं है। क्या होगा, मैं चेक को गठबंधन करता हूं, पहले जांचता हूं कि उपयोगकर्ता लॉग इन है या नहीं, जांच करें कि आईपी सत्र आईपी के साथ मेल खाता है या नहीं और जांचें कि उपयोगकर्ता एजेंट सत्र उपयोगकर्ता एजेंट से मेल खाता है या नहीं ?? क्या यह व्यर्थ है? मुझे बस इसे जारी करने का उपयोग करने की आवश्यकता है ?? – bbtang
बीटीडब्ल्यू, जोन उत्तर के आधार पर। ऐसा लगता है कि session_regenerate_id() एक और अच्छी चीज है? क्या मैं इस तरह से कर सकता हूं, उपयोगकर्ता लॉग इन करने के बाद, session_start() और फिर sessio_regenerate_id() को कॉल करें ?? क्या यह अच्छा है या इसकी व्यर्थ (अतिरिक्त चीजें केवल) ?? – bbtang
** @ बीबीटीएंग: ** दोनों विधियों का संयोजन उनके डाउनसाइड्स को भी जोड़ देगा। आप अपने विवेकाधिकार पर ऐसा कर सकते हैं। –