यह मार्गदर्शिका आपको दिखाएगी कि कैसे आप अपने सत्रों को एक mySQL डेटाबेस में सुरक्षित रूप से संग्रहीत कर सकते हैं। हम डेटाबेस में जाने वाले सभी सत्र डेटा को भी एन्क्रिप्ट करेंगे, जिसका अर्थ है कि यदि कोई डेटाबेस में हैक करने का प्रबंधन करता है तो सभी सत्र डेटा 256-बिट एईएस एन्क्रिप्शन द्वारा एन्क्रिप्ट किया जाता है।
कदम
विधि 1 में से 3: mySQL डेटाबेस कॉन्फ़िगर करें
चरण 1. एक MySQL डेटाबेस बनाएँ।
इस गाइड में हम "secure_sessions" नामक एक डेटाबेस बनाएंगे।
देखें कि कैसे एक डेटाबेस-में-phpMyAdmin बनाएँ।
या आप नीचे दिए गए SQL कोड का उपयोग कर सकते हैं जो आपके लिए एक बना देगा।
डेटाबेस कोड बनाएँ:
डेटाबेस बनाएँ `सुरक्षित_सत्र`;
नोट: कुछ होस्टिंग सेवाएं आपको phpMyAdmin के माध्यम से डेटाबेस बनाने की अनुमति नहीं देती हैं, cPanel में इसे कैसे करें सीखें।
चरण 2. केवल SELECT, INSERT और DELETE विशेषाधिकारों वाला उपयोगकर्ता बनाएं।
इसका मतलब यह है कि अगर कभी हमारी स्क्रिप्ट में सुरक्षा का उल्लंघन होता है तो हैकर हमारे डेटाबेस से टेबल नहीं छोड़ सकता है। यदि आप वास्तव में पागल हैं, तो प्रत्येक फ़ंक्शन के लिए एक अलग उपयोगकर्ता बनाएं।
-
उपयोगकर्ता:
"sec_user"
-
पासवर्ड:
"eKcGZr59zAa2BEWU"
उपयोगकर्ता कोड बनाएं:
'eKcGZr59zAa2BEWU' द्वारा पहचाने गए उपयोगकर्ता 'sec_user'@'localhost' बनाएं; अनुदान चुनें, सम्मिलित करें, अपडेट करें, `सिक्योर_सेशन` पर हटाएं।* 'sec_user'@'localhost' पर;
नोट: अपने सर्वर पर चलते समय उपरोक्त कोड में पासवर्ड बदलना एक अच्छा विचार है। (सुनिश्चित करें कि आप अपना PHP कोड भी बदलते हैं।) याद रखें कि इसे एक पासवर्ड होने की आवश्यकता नहीं है जिसे आप याद रख सकते हैं इसलिए बनाना जितना संभव हो उतना जटिल है। यहाँ एक यादृच्छिक पासवर्ड जनरेटर है।
चरण 3. "सत्र" नामक एक MySQL तालिका बनाएं।
नीचे दिया गया कोड 4 फ़ील्ड (आईडी, सेट_टाइम, डेटा, सेशन_की) के साथ एक टेबल बनाता है।
"सत्र" तालिका बनाएं:
तालिका बनाएं `सत्र` (`आईडी` चार(१२८) शून्य नहीं, `सेट_टाइम` चार(१०) शून्य नहीं, `डेटा` पाठ शून्य नहीं, `सत्र_की` चार(१२८) शून्य नहीं, प्राथमिक कुंजी (`आईडी`)) इंजन = InnoDB डिफ़ॉल्ट वर्ण = latin1;
हम उन क्षेत्रों के लिए CHAR डेटाटाइप का उपयोग करते हैं जिनकी हम लंबाई जानते हैं, क्योंकि "id" और "session_key" फ़ील्ड हमेशा 128 वर्ण लंबे होंगे। यहां CHAR का उपयोग करने से प्रोसेसिंग पावर की बचत होती है।
विधि 2 का 3: session.class.php फ़ाइल बनाएँ
चरण 1. कक्षा बनाएँ।
एक नई कक्षा शुरू करने के लिए आपको नीचे दिया गया कोड दर्ज करना होगा:
नई कक्षा:
कक्षा सत्र {
चरण 2. _construct फ़ंक्शन बनाएं।
हर बार जब हम 'सत्र' वर्ग का उपयोग करके किसी ऑब्जेक्ट का एक नया उदाहरण बनाते हैं तो यह फ़ंक्शन कॉल किया जाएगा। आप यहां PHP _construct function पर पढ़ सकते हैं।
यह फ़ंक्शन हमारे कस्टम सत्र हैंडलर को सेट करता है, इसलिए जैसे ही कक्षा को तत्काल (यानी, निर्मित/निर्मित/निर्मित) किया जाता है, यह उपयोग के लिए उपलब्ध होता है।
_निर्माण समारोह:
फ़ंक्शन _construct() {// हमारे कस्टम सत्र फ़ंक्शन सेट करें। session_set_save_handler (सरणी ($ यह, 'खुला'), सरणी ($ यह, 'बंद'), सरणी ($ यह, 'पढ़ें'), सरणी ($ यह, 'लिखें'), सरणी ($ यह, 'नष्ट'), सरणी ($ यह, 'जीसी')); // यह लाइन ऑब्जेक्ट को सेव हैंडलर के रूप में उपयोग करते समय अप्रत्याशित प्रभावों को रोकती है। register_shutdown_function ('session_write_close'); }
चरण 3. start_session फ़ंक्शन बनाएं।
हर बार जब आप एक नया सत्र शुरू करना चाहते हैं तो इस फ़ंक्शन को कॉल किया जाएगा, इसे session_start (); के बजाय उपयोग करें। प्रत्येक पंक्ति क्या करती है यह देखने के लिए कोड में टिप्पणियां देखें।
start_session फ़ंक्शन:
फ़ंक्शन start_session($session_name, $secure) {// सुनिश्चित करें कि सत्र कुकी जावास्क्रिप्ट के माध्यम से सुलभ नहीं है। $httponly = सच; // सत्र के लिए उपयोग करने के लिए हैश एल्गोरिथ्म। (उपलब्ध हैश की सूची प्राप्त करने के लिए hash_algos() का उपयोग करें।) $session_hash = 'sha512'; // जांचें कि क्या हैश उपलब्ध है अगर (in_array($session_hash, hash_algos ())) {//हैस फंक्शन सेट करें। ini_set('session.hash_function', $session_hash); }//हैश के प्रति वर्ण कितने बिट्स। // संभावित मान '4' (0-9, a-f), '5' (0-9, a-v), और '6' (0-9, a-z, A-Z, "-", ", ") हैं। ini_set('session.hash_bits_per_character', 5); // सत्र को केवल कुकीज़ का उपयोग करने के लिए बाध्य करें, URL चर नहीं। ini_set ('session.use_only_cookies', 1); // सत्र कुकी पैरामीटर प्राप्त करें $cookieParams = session_get_cookie_params (); // पैरामीटर सेट करें session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); // सत्र का नाम बदलें session_name($session_name); // अब हम सत्र सत्र_स्टार्ट () शुरू करते हैं; // यह लाइन सत्र को पुन: उत्पन्न करती है और पुराने को हटा देती है। // यह डेटाबेस में एक नई एन्क्रिप्शन कुंजी भी उत्पन्न करता है। session_regenerate_id (सच); }
चरण 4. ओपन फंक्शन बनाएं।
इस फ़ंक्शन को PHP सत्र द्वारा बुलाया जाएगा जब हम एक नया सत्र शुरू करते हैं, तो हम इसका उपयोग एक नया डेटाबेस कनेक्शन शुरू करने के लिए करते हैं।
खुला समारोह:
समारोह खुला () {$ होस्ट = 'लोकलहोस्ट'; $ उपयोगकर्ता = 'sec_user'; $ पास = 'eKcGZr59zAa2BEWU'; $ नाम = 'सुरक्षित_सत्र'; $mysqli = नया mysqli ($ होस्ट, $ उपयोगकर्ता, $ पास, $ नाम); $यह->डीबी = $mysqli; सच लौटना; }
चरण 5. करीबी कार्य बनाएँ।
जब सत्र बंद करना चाहते हैं तो यह फ़ंक्शन कॉल किया जाएगा।
बंद समारोह:
फ़ंक्शन बंद करें () {$ यह-> डीबी-> बंद करें (); सच लौटना; }
चरण 6. रीड फंक्शन बनाएं।
यह फ़ंक्शन PHP द्वारा कॉल किया जाएगा जब हम एक सत्र तक पहुंचने का प्रयास करते हैं उदाहरण के लिए जब हम echo $_SESSION['something']; का उपयोग करते हैं। क्योंकि एक ही पृष्ठ पर इस फ़ंक्शन के लिए कई कॉल हो सकते हैं, हम न केवल सुरक्षा के लिए बल्कि प्रदर्शन के लिए भी तैयार किए गए बयानों का लाभ उठाते हैं। हम केवल एक बार स्टेटमेंट तैयार करते हैं फिर हम इसे कई बार निष्पादित कर सकते हैं।
हम डेटाबेस में एन्क्रिप्टेड सत्र डेटा को भी डिक्रिप्ट करते हैं। हम अपने सत्रों में 256-बिट एईएस एन्क्रिप्शन का उपयोग कर रहे हैं।
फ़ंक्शन पढ़ें:
फ़ंक्शन पढ़ें($id) { अगर(!isset($this->read_stmt)) { $this->read_stmt = $this->db->prepare ("सत्रों से डेटा चुनें जहां आईडी =? LIMIT 1"); } $this->read_stmt->bind_param('s', $id); $this->read_stmt->execute(); $this->read_stmt->store_result(); $this->read_stmt->bind_result($data); $this->read_stmt->fetch(); $ कुंजी = $ यह-> गेटकी ($ आईडी); $ डेटा = $ यह-> डिक्रिप्ट ($ डेटा, $ कुंजी); $ डेटा वापस करें; }
चरण 7. लेखन कार्य बनाएँ।
इस फ़ंक्शन का उपयोग तब किया जाता है जब हम किसी सत्र को मान निर्दिष्ट करते हैं, उदाहरण के लिए $_SESSION['something'] = 'something else';। यह फ़ंक्शन उन सभी डेटा को एन्क्रिप्ट करता है जो डेटाबेस में सम्मिलित हो जाते हैं।
समारोह लिखें:
फ़ंक्शन लिखना ($ आईडी, $ डेटा) {// अद्वितीय कुंजी प्राप्त करें $ कुंजी = $ यह-> गेटकी ($ आईडी); // डेटा एन्क्रिप्ट करें $ डेटा = $ यह-> एन्क्रिप्ट करें ($ डेटा, $ कुंजी); $ समय = समय (); if(!isset($this->w_stmt)) { $this->w_stmt = $this->db->prepare ("सत्रों में बदलें (id, set_time, data, session_key) VALUES (?, ?, ?, ?)"); } $this->w_stmt->bind_param('siss', $id, $time, $data, $key); $this->w_stmt->execute(); सच लौटना; }
चरण 8. नष्ट समारोह बनाएँ।
यह फ़ंक्शन डेटाबेस से सत्र को हटा देता है, इसका उपयोग PHP द्वारा किया जाता है जब हम session_destroy (); जैसे फ़ंक्शन को कॉल करते हैं।
नष्ट समारोह:
फ़ंक्शन नष्ट करें ($ id) {अगर (! जारी ($ यह-> हटाएं_stmt)) {$ यह-> हटाएं_स्टमटी = $ यह-> डीबी-> तैयार करें ("सत्रों से हटाएं जहां आईडी =?"); } $this->delete_stmt->bind_param('s', $id); $this->delete_stmt->execute(); सच लौटना; }
चरण 9. gc (कचरा संग्रहकर्ता) फ़ंक्शन बनाएँ।
यह फ़ंक्शन कचरा संग्रहकर्ता फ़ंक्शन है जिसे पुराने सत्रों को हटाने के लिए कहा जाता है। जिस आवृत्ति में इस फ़ंक्शन को कॉल किया जाता है वह दो कॉन्फ़िगरेशन निर्देशों, session.gc_probability और session.gc_divisor द्वारा निर्धारित किया जाता है।
जीसी () फ़ंक्शन:
फ़ंक्शन gc($max) { if(!isset($this->gc_stmt)) { $this->gc_stmt = $this->db->prepare ("सत्रों से हटाएं जहां सेट_टाइम <?"); } $ पुराना = समय () - $ अधिकतम; $this->gc_stmt->bind_param('s', $old); $this->gc_stmt->execute(); सच लौटना; }
चरण 10. गेटकी फ़ंक्शन बनाएं।
इस फ़ंक्शन का उपयोग सत्र तालिका से एन्क्रिप्शन के लिए अद्वितीय कुंजी प्राप्त करने के लिए किया जाता है। यदि कोई सत्र नहीं है तो यह एन्क्रिप्शन के लिए सिर्फ एक नई यादृच्छिक कुंजी देता है।
गेटकी () फ़ंक्शन:
निजी फ़ंक्शन गेटकी($आईडी) { अगर(!isset($this->key_stmt)) { $this->key_stmt = $this->db->prepare ("सत्रों से सत्र_की चुनें जहां आईडी =? LIMIT 1"); } $this->key_stmt->bind_param('s', $id); $ यह-> key_stmt-> निष्पादित (); $this->key_stmt->store_result(); if($this->key_stmt->num_rows == 1) {$this->key_stmt->bind_result($key); $this->key_stmt->fetch(); $ कुंजी वापस करें; } और {$random_key = हैश('sha512', uniqid(mt_rand(1, mt_getrandmax()), true)); $random_key वापस करें; } }
चरण 11. एन्क्रिप्ट और डिक्रिप्ट फ़ंक्शन बनाएं।
ये फ़ंक्शन सत्रों के डेटा को एन्क्रिप्ट करते हैं, वे डेटाबेस से एक एन्क्रिप्शन कुंजी का उपयोग करते हैं जो प्रत्येक सत्र के लिए अलग होता है। हम एन्क्रिप्शन में सीधे उस कुंजी का उपयोग नहीं करते हैं, लेकिन हम इसका उपयोग कुंजी हैश को और भी अधिक यादृच्छिक बनाने के लिए करते हैं।
एन्क्रिप्ट () और डिक्रिप्ट () फ़ंक्शन:
निजी फ़ंक्शन एन्क्रिप्ट($डेटा, $कुंजी) { $salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH'; $ कुंजी = सबस्ट्र (हैश ('sha256', $ नमक। $ कुंजी। $ नमक), 0, 32); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_ECB, $iv)); $ एन्क्रिप्टेड वापसी; } निजी फ़ंक्शन डिक्रिप्ट($डेटा, $कुंजी) { $salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH'; $ कुंजी = सबस्ट्र (हैश ('sha256', $ नमक। $ कुंजी। $ नमक), 0, 32); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($data), MCRYPT_MODE_ECB, $iv); $ डिक्रिप्टेड = आरट्रिम ($ डिक्रिप्टेड, "\ 0"); $ डिक्रिप्टेड वापसी; }
चरण 12. कक्षा समाप्त करें।
यहाँ हम सिर्फ घुंघराले कोष्ठकों को समाप्त करते हैं:
अंत वर्ग:
}
विधि 3 में से 3: सत्रों के साथ पृष्ठ बनाना
चरण 1. कस्टम सत्र प्रबंधक के साथ सत्रों का उपयोग करना।
नीचे बताया गया है कि आप एक नया सत्र कैसे शुरू करेंगे; आपको इसे प्रत्येक पृष्ठ पर शामिल करना होगा जिसे आप सत्रों तक पहुंचना चाहते हैं, सत्र_स्टार्ट () के बजाय इसका इस्तेमाल करें;
एक सत्र शुरू करना:
आवश्यकता ('सत्र.वर्ग.php'); $ सत्र = नया सत्र (); // यदि https $session->start_session('_s', false) का उपयोग कर रहे हैं तो सही पर सेट करें; $_SESSION['something'] = 'A value.'; गूंज $ _ सत्र ['कुछ'];