PHP के साथ जिम्मेदार सत्र सुरक्षा बनाए रखने के लिए कुछ दिशानिर्देश क्या हैं? पूरे वेब पर जानकारी है और यह समय है जब यह सभी एक ही स्थान पर उतरा है!
PHP के साथ जिम्मेदार सत्र सुरक्षा बनाए रखने के लिए कुछ दिशानिर्देश क्या हैं? पूरे वेब पर जानकारी है और यह समय है जब यह सभी एक ही स्थान पर उतरा है!
जवाबों:
आपके सत्र को सुरक्षित रखने के लिए कुछ चीज़ें हैं:
$_SERVER['HTTP_USER_AGENT']
। यह सत्र अपहरण में एक छोटा अवरोध जोड़ता है। आप आईपी एड्रेस भी चेक कर सकते हैं। लेकिन यह उन उपयोगकर्ताओं के लिए समस्या का कारण बनता है, जिनके पास कई इंटरनेट कनेक्शन आदि पर लोड संतुलन (जो कि हमारे वातावरण में मामला है) के कारण आईपी एड्रेस बदल रहा है।हर बार सत्र के सुरक्षा स्तर में बदलाव के लिए एक दिशानिर्देश को session_regenerate_id पर कॉल करना होता है। यह सत्र अपहरण को रोकने में मदद करता है।
मेरे दो (या अधिक) सेंट:
इस विषय पर एक छोटी लेकिन अच्छी पुस्तक है: क्रिस शिफ्टलेट द्वारा आवश्यक PHP सुरक्षा ।
आवश्यक PHP सुरक्षा http://shiflett.org/images/essential-php-security-small.png
पुस्तक के मुख पृष्ठ पर आपको कुछ दिलचस्प कोड उदाहरण और नमूना अध्याय मिलेंगे।
आप यहां वर्णित तकनीक (IP & UserAgent) के ऊपर उपयोग कर सकते हैं, पहचान की चोरी से कैसे बचें
मुझे लगता है कि प्रमुख समस्याओं में से एक (जिसे PHP 6 में संबोधित किया जा रहा है) register_globals है। अभी बचने register_globals
के लिए इस्तेमाल किया जाने वाला एक मानक तरीका है $_REQUEST
, $_GET
या $_POST
सरणियों का उपयोग करना ।
इसे करने के लिए "सही" तरीका (5.2 के रूप में, हालांकि यह वहां थोड़ा छोटी गाड़ी है, लेकिन 6 के रूप में स्थिर है, जो जल्द ही आ रहा है) फिल्टर के माध्यम से है ।
इसलिए इसके बजाय:
$username = $_POST["username"];
तुम करोगे:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
या अभी भी:
$username = filter_input(INPUT_POST, 'username');
इस सत्र निर्धारण पेपर में बहुत अच्छे संकेत हैं जहां हमला हो सकता है। विकिपीडिया पर सत्र निर्धारण पृष्ठ भी देखें ।
IP पते का उपयोग करना वास्तव में मेरे अनुभव का सबसे अच्छा विचार नहीं है। उदाहरण के लिए; मेरे कार्यालय के दो आईपी पते हैं जो लोड के आधार पर उपयोग किए जाते हैं और हम लगातार आईपी पते का उपयोग करते हुए मुद्दों में भाग लेते हैं।
इसके बजाय, मैंने अपने सर्वर पर डोमेन के लिए एक अलग डेटाबेस में सत्रों को संग्रहीत करने का विकल्प चुना है। इस तरह से फ़ाइल सिस्टम पर किसी को भी उस सत्र जानकारी तक पहुँच नहीं है। यह वास्तव में 3.0 से पहले phpBB के साथ मददगार था (वे तय के बाद से) लेकिन यह अभी भी मुझे लगता है कि एक अच्छा विचार है।
यह बहुत तुच्छ और स्पष्ट है, लेकिन हर उपयोग के बाद session_destroy के लिए सुनिश्चित करें। इसे लागू करना मुश्किल हो सकता है यदि उपयोगकर्ता स्पष्ट रूप से लॉग आउट नहीं करता है, तो ऐसा करने के लिए एक टाइमर सेट किया जा सकता है।
यहाँ setTimer () और clearTimer () पर एक अच्छा ट्यूटोरियल है ।
PHP सत्र और सुरक्षा (सत्र अपहरण के अलावा) के साथ मुख्य समस्या यह है कि आप किस वातावरण में हैं। डिफ़ॉल्ट रूप से OS के अस्थायी निर्देशिका में फ़ाइल में सत्र डेटा संग्रहीत करता है। किसी विशेष विचार या योजना के बिना यह एक विश्व पठनीय निर्देशिका है, इसलिए आपके सत्र की सभी जानकारी सर्वर तक पहुंच के साथ किसी के लिए भी सार्वजनिक है।
कई सर्वरों पर सत्र बनाए रखने के लिए। उस बिंदु पर PHP को उपयोगकर्ता द्वारा संभाले गए सत्रों में बदलना बेहतर होगा जहां यह सत्र डेटा के लिए आपके प्रदान किए गए कार्यों को CRUD (कॉल, रीड, अपडेट, डिलीट) कहता है। उस बिंदु पर आप सत्र जानकारी को डेटाबेस या समाधान जैसे समाधान में संग्रहीत कर सकते हैं ताकि सभी एप्लिकेशन सर्वर के पास डेटा तक पहुंच हो।
यदि आप साझा सर्वर पर हैं, तो अपने स्वयं के सत्रों को संग्रहीत करना भी फायदेमंद हो सकता है क्योंकि यह आपको उस डेटाबेस में संग्रहीत करने देगा, जिस पर आप अक्सर नियंत्रण रखते हैं तब फाइल सिस्टम।
मैंने अपने सत्रों को इस तरह सेट किया-
लॉग इन पेज पर:
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
(वाक्यांश एक कॉन्फ़िगर पृष्ठ पर परिभाषित)
फिर हेडर पर जो बाकी साइट पर है:
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {
session_destroy();
header('Location: http://website login page/');
exit();
}
session.cookie_httponly = 1
change session name from default PHPSESSID
X-XSS-Protection 1
X-XSS-Protection
वास्तव में उपयोगी नहीं है। वास्तव में, स्वयं की रक्षा करने वाला एल्गोरिदम वास्तव में शोषण किया जा सकता है, जिससे यह पहले से भी बदतर हो गया है।
मैं आईपी और उपयोगकर्ता एजेंट दोनों की जांच करूंगा कि क्या वे बदलते हैं
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
//Something fishy is going on here?
}
यदि आप session_set_save_handler () का उपयोग करते हैं, तो आप अपना सत्र हैंडलर सेट कर सकते हैं। उदाहरण के लिए आप डेटाबेस में अपने सत्रों को संग्रहीत कर सकते हैं। डेटाबेस सत्र हैंडलर के उदाहरणों के लिए php.net टिप्पणियों का संदर्भ लें।
DB सत्र भी अच्छे हैं यदि आपके पास कई सर्वर हैं अन्यथा यदि आप फ़ाइल आधारित सत्रों का उपयोग कर रहे हैं तो आपको यह सुनिश्चित करने की आवश्यकता होगी कि प्रत्येक वेबसर्वर के पास सत्रों को पढ़ने / लिखने के लिए एक ही फाइल सिस्टम के लिए उपयोग हो।
आपको यह सुनिश्चित करने की आवश्यकता है कि सत्र डेटा सुरक्षित है। अपने php.ini को देखकर या phpinfo () का उपयोग करके आप सत्र सेटिंग्स पा सकते हैं। _session.save_path_ आपको बताता है कि वे कहाँ सहेजे गए हैं।
फ़ोल्डर और उसके माता-पिता की अनुमति की जाँच करें। यह सार्वजनिक (/ tmp) नहीं होना चाहिए या आपके साझा सर्वर पर अन्य वेबसाइटों द्वारा सुलभ होना चाहिए।
मान लें कि आप अभी भी php सेशन का उपयोग करना चाहते हैं, तो आप _session.save_path_ को बदलकर या किसी अन्य फ़ोल्डर का उपयोग करके डेटाबेस में डेटा को _session.save_handler_ बदलकर सेट कर सकते हैं।
आप अपने php.ini में _session.save_path_ (कुछ प्रदाता इसे अनुमति देते हैं) या अपाचे + mod_php के लिए, अपने साइट रूट फ़ोल्डर में एक .htaccess फ़ाइल में सेट करने में सक्षम हो सकते हैं
php_value session.save_path "/home/example.com/html/session"
:। आप इसे रन टाइम पर _session_save_path () _ के साथ भी सेट कर सकते हैं।
सेट और वैकल्पिक सत्र हैंडलर के लिए क्रिस शिफलेट के ट्यूटोरियल या Zend_Session_SaveHandler_DbTable की जाँच करें ।