ठीक है, दो अलग-अलग लेकिन संबंधित समस्याएं हैं, और प्रत्येक को अलग तरीके से नियंत्रित किया जाता है।
सत्र निर्धारण
यह वह जगह है जहां एक हमलावर स्पष्ट रूप से उपयोगकर्ता के लिए सत्र के सत्र पहचानकर्ता को निर्धारित करता है। आमतौर पर PHP में यह उनके जैसे url देकर किया जाता है http://www.example.com/index...?session_name=sessionid
। एक बार जब हमलावर ग्राहक को url देता है, तो हमला एक सत्र अपहरण अपहरण के समान होता है।
सत्र निर्धारण को रोकने के कुछ तरीके हैं (उन सभी को करें):
session.use_trans_sid = 0
अपनी php.ini
फ़ाइल में सेट करें । यह PHP को पहचानकर्ता को URL में शामिल नहीं करने, और पहचानकर्ताओं के लिए URL पढ़ने के लिए नहीं बताएगा।
session.use_only_cookies = 1
अपनी php.ini
फ़ाइल में सेट करें । यह PHP को बताएगा कि सत्र पहचानकर्ताओं के साथ कभी भी URL का उपयोग न करें।
सत्र की स्थिति में कभी भी परिवर्तन करने के लिए सत्र ID पुनर्जीवित करें। इसका मतलब निम्न में से कोई है:
- प्रयोक्ता प्रमाणीकरण
- सत्र में संवेदनशील जानकारी संग्रहीत करना
- सत्र के बारे में कुछ भी बदलना
- आदि...
सत्र अपहरण
यह वह जगह है जहां एक हमलावर को एक सत्र पहचानकर्ता की पकड़ मिलती है और अनुरोध भेजने में सक्षम होता है जैसे कि वे उस उपयोगकर्ता थे। इसका मतलब यह है कि चूंकि हमलावर के पास पहचानकर्ता है, इसलिए वे सर्वर के संबंध में वैध उपयोगकर्ता से अप्रभेद्य हैं।
आप सीधे सत्र अपहरण को नहीं रोक सकते। हालाँकि आप इसे उपयोग करने के लिए बहुत कठिन और कठिन बनाने के लिए कदम रख सकते हैं।
एक मजबूत सत्र हैश पहचानकर्ता का उपयोग करें: session.hash_function
में php.ini
। यदि PHP <5.3, इसे session.hash_function = 1
SHA1 के लिए सेट करें । अगर PHP> = 5.3 है, तो इसे session.hash_function = sha256
या पर सेट करें session.hash_function = sha512
।
एक मजबूत हैश भेजें: session.hash_bits_per_character
में php.ini
। इस पर सेट करें session.hash_bits_per_character = 5
। हालांकि यह दरार करने के लिए किसी भी कठिन नहीं बनाता है , यह एक फर्क पड़ता है जब हमलावर सत्र पहचानकर्ता का अनुमान लगाने की कोशिश करता है। आईडी छोटी होगी, लेकिन अधिक वर्णों का उपयोग करती है।
अपनी फ़ाइल में session.entropy_file
और साथ एक अतिरिक्त एन्ट्रापी सेट करें । पूर्व और बाद के बाइट्स की संख्या को सेट करें, जो कि एंट्रॉपी फ़ाइल से पढ़ी जाएगी, उदाहरण के लिए ।session.entropy_length
php.ini
session.entropy_file = /dev/urandom
session.entropy_length = 256
डिफ़ॉल्ट PHPSESSID से सत्र का नाम बदलें। यह कॉलिंग session_name()
से पहले पहले पैरामीटर के रूप में अपने स्वयं के पहचानकर्ता नाम के साथ कॉल करके पूरा किया जाता है session_start
।
यदि आप वास्तव में पागल हैं तो आप सत्र के नाम को भी घुमा सकते हैं, लेकिन सावधान रहें कि यदि आप इसे बदलते हैं (उदाहरण के लिए, यदि आप इसे समय पर निर्भर करते हैं) तो सभी सत्र स्वतः अमान्य हो जाएंगे। लेकिन आपके उपयोग-मामले के आधार पर, यह एक विकल्प हो सकता है ...
अपने सत्र पहचानकर्ता को अक्सर घुमाएँ। मैं यह हर अनुरोध नहीं करूंगा (जब तक आपको वास्तव में सुरक्षा के उस स्तर की आवश्यकता नहीं है), लेकिन एक यादृच्छिक अंतराल पर। आप इसे अक्सर बदलना चाहते हैं यदि कोई हमलावर एक सत्र को हाइजैक करता है तो आप नहीं चाहते हैं कि वे इसे बहुत लंबे समय तक उपयोग करने में सक्षम हों।
सत्र में उपयोगकर्ता एजेंट$_SERVER['HTTP_USER_AGENT']
शामिल करें । मूल रूप से, जब सत्र शुरू होता है, तो इसे कुछ इस तरह से संग्रहीत करें $_SESSION['user_agent']
। फिर, प्रत्येक बाद के अनुरोध पर जाँच करें कि यह मेल खाता है। ध्यान दें कि यह नकली हो सकता है इसलिए यह 100% विश्वसनीय नहीं है, लेकिन यह बेहतर है।
सत्र में उपयोगकर्ता का IP पता$_SERVER['REMOTE_ADDR']
शामिल करें । मूल रूप से, जब सत्र शुरू होता है, तो इसे कुछ इस तरह से संग्रहीत करें $_SESSION['remote_ip']
। यह कुछ आईएसपी से समस्याग्रस्त हो सकता है जो अपने उपयोगकर्ताओं के लिए कई आईपी पते का उपयोग करते हैं (जैसे कि एओएल करते थे)। लेकिन अगर आप इसका उपयोग करते हैं, तो यह अधिक सुरक्षित होगा। एक हमलावर के लिए आईपी पते को नकली करने का एकमात्र तरीका वास्तविक उपयोगकर्ता और आपके बीच किसी बिंदु पर नेटवर्क से समझौता करना है। और अगर वे नेटवर्क से समझौता करते हैं, तो वे अपहरण (जैसे MITM हमलों, आदि) से कहीं अधिक बुरा कर सकते हैं।
सत्र में और ब्राउज़र साइड पर एक टोकन शामिल करें जिसे आप बढ़ाते हैं और अक्सर तुलना करते हैं। मूल रूप से, प्रत्येक अनुरोध के लिए $_SESSION['counter']++
सर्वर की तरफ। जेएस में भी ब्राउज़रों की तरफ से कुछ ऐसा ही करें (स्थानीय भंडारण का उपयोग करके)। फिर, जब आप एक अनुरोध भेजते हैं, तो बस एक टोकन का नॉन ले लें, और सत्यापित करें कि सर्वर पर नॉनस समान है। ऐसा करने से, आपको एक अपहृत सत्र का पता लगाने में सक्षम होना चाहिए क्योंकि हमलावर के पास सटीक काउंटर नहीं होगा, या यदि वे करते हैं तो आपके पास एक ही गिनती को प्रसारित करने वाले 2 सिस्टम होंगे और बता सकते हैं कि जाली है। यह सभी अनुप्रयोगों के लिए काम नहीं करेगा, लेकिन समस्या का मुकाबला करने का एक तरीका है।
दो पर एक नोट
सत्र निर्धारण और अपहरण के बीच अंतर केवल यह है कि सत्र पहचानकर्ता के साथ समझौता कैसे किया जाता है। निर्धारण में, पहचानकर्ता को एक मूल्य पर सेट किया जाता है जिसे हमलावर हाथ से पहले जानता है। अपहरण में यह या तो अनुमान लगाया गया है या उपयोगकर्ता से चुराया गया है। अन्यथा पहचानकर्ता के समझौता करने के बाद दोनों के प्रभाव समान होते हैं।
सत्र आईडी पुनर्जनन
जब भी आप सत्र पहचानकर्ता को पुनर्जीवित करते हैं session_regenerate_id
तो पुराने सत्र का उपयोग करना चाहिए। यह कोर सत्र हैंडलर के साथ पारदर्शी रूप से होता है। हालाँकि कुछ कस्टम सेशन हैंडलर इसका उपयोगsession_set_save_handler()
नहीं करते हैं और पुराने सत्र पहचानकर्ताओं पर हमला करने के लिए खुले हैं। सुनिश्चित करें कि यदि आप एक कस्टम सत्र हैंडलर का उपयोग कर रहे हैं, तो आप अपने द्वारा खोले जाने वाले पहचानकर्ता का ध्यान रखें, और यदि यह वही नहीं है जिसे आप सहेजते हैं तो आप पुराने पर पहचानकर्ता को स्पष्ट रूप से हटा (या परिवर्तित) करते हैं।
डिफ़ॉल्ट सत्र हैंडलर का उपयोग करना, आप केवल कॉल करने के साथ ठीक हैं session_regenerate_id(true)
। जो आपके लिए पुराने सत्र की जानकारी को हटा देगा। पुरानी आईडी अब मान्य नहीं है और यदि हमलावर (या उस मामले के लिए किसी और) ने इसका उपयोग करने की कोशिश की तो एक नया सत्र बनाया जाएगा। कस्टम सत्र संचालकों के साथ सावधान रहें, हालांकि ...।
एक सत्र को नष्ट करना
यदि आप एक सत्र (उदाहरण के लिए लॉगआउट पर) को नष्ट करने जा रहे हैं, तो सुनिश्चित करें कि आप इसे अच्छी तरह से नष्ट कर दें। इसमें कुकी को परेशान करना शामिल है। का उपयोग कर session_destroy
:
function destroySession() {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
session_destroy();
}