ekterya.com

PHP और MySQL में एक सुरक्षित सत्र प्रबंधन प्रणाली कैसे तैयार करें

यह मार्गदर्शिका आपको दिखाएगा कि कैसे सत्रों को सुरक्षित रूप से एक MySQL डाटाबेस में सहेजना है। तुम भी डेटाबेस के लिए जाने के लिए सत्र के सभी डेटा को एन्क्रिप्ट करने सीखना होगा, या किसी डेटाबेस को हैक करने का प्रबंधन करता है, सभी डेटा एईएस 256 बिट एन्क्रिप्शन के साथ सत्र होगा।

चरणों

विधि 1

MySQL डाटाबेस को कॉन्फ़िगर करें
1
एक MySQL डाटाबेस बनाएँ
इस गाइड में हम एक डाटाबेस बनाएंगे जिसे नामांकित किया जाएगा sesiones_seguras।
देखें कि phpMyAdmin में एक डेटाबेस कैसे बनाया गया है।

Video: Introduction to Amazon Web Services by Leo Zhadanovsky


या आप एक बनाने के लिए नीचे एसक्यूएल कोड का उपयोग कर सकते हैं

डेटाबेस कोड बनाएँ:
डेटाबैस `सुरक्षित_सैशन` बनाएं -

नोट: कुछ होस्टिंग सेवाएं आपको phpMyAdmin के साथ एक डेटाबेस बनाने की अनुमति नहीं देते हैं, इसे सीपीएनएल में करना सीखें.
  • 2
    एक उपयोगकर्ता बनाएं जिसे केवल चुनिए, INSERT और DELETE के लिए विशेषाधिकार हैं।
    इसलिए यदि हमारी स्क्रिप्ट की सुरक्षा में कोई भी उल्लंघन है, तो हैकर डेटाबेस से तालिकाओं को नहीं हटा सकता है। यदि आप वास्तव में पागल हैं, तो प्रत्येक फ़ंक्शन के लिए एक अलग उपयोगकर्ता बनाएं।

  • उपयोगकर्ता: "Sec_user"
  • पासवर्ड: "EKcGZr59zAa2BEWU"


  • उपयोगकर्ता कोड बनाएं:
    उपयोगकर्ता बनाएं `sec_user` @ `localhost` से पहचान `, eKcGZr59zAa2BEWU`-GRANT का चयन करें, सम्मिलित करें, अद्यतन `sesiones_seguras` पर DELETE। * के लिए` sec_user `@` localhost`-

    नोट: एक अच्छा विचार है कि जब आप अपने स्वयं के सर्वर पर निष्पादित करते हुए उपरोक्त कोड का पासवर्ड बदलना चाहते हैं (PHP कोड भी बदलना सुनिश्चित करें)। याद रखें कि आपको पासवर्ड याद रखने की आवश्यकता नहीं है, ताकि आप इसे जितना कठिन कर सकें। यहां एक जनरेटर है यादृच्छिक पासवर्ड.
  • 3
    "सत्र" नामक एक MySQL तालिका बनाएं
    निम्न कोड वाला कोड 4 फ़ील्ड (आईडी, समय, डेटा, सत्र_की) के साथ बनाएगा।

    "सत्र" तालिका बनाएं:
    टेबल `sesiones` (` id` CHAR (128), शून्य नहीं बना `horario` CHAR (10) नहीं NULL,` डेटा` पाठ नहीं NULL, `clave_sesion` CHAR (128) नहीं NULL, प्राथमिक कुंजी (` id`) ) इंजन = इंनोडीबी डिफॉल्ट चार्सेट = latin1-

    ज्ञात लंबाई वाले क्षेत्रों के लिए सीआरएआर डेटा प्रकार का प्रयोग करें, जैसे कि "id" और "session_key" फ़ील्ड, जो कि हमेशा 128 अक्षर लंबा होगा CHAR का उपयोग करके हम प्रसंस्करण शक्ति को बचाएंगे I
  • विधि 2

    एक sesion.class.php फ़ाइल बनाएँ
    1
    एक क्लास बनाएं
    एक नया वर्ग शुरू करने के लिए, आपको निम्न कोड दर्ज करना होगा:

    नया वर्ग:
    वर्ग सत्र {
  • 2
    फ़ंक्शन __ रचना बनाएं
    इस समारोह को हर बार जब आप `सत्र सत्र` का प्रयोग करते हुए किसी ऑब्जेक्ट का एक नया इंस्टेंस बनाते हैं तो कहा जाएगा। आप PHP _construct फ़ंक्शन के बारे में पढ़ सकते हैं यहां.
    यह फ़ंक्शन हमारे कस्टम सत्र मैनेजर को कॉन्फ़िगर करता है, ताकि यह आरंभ हो सकें कि जैसे क्लास आरंभ होता है (अर्थात यह किया जाता है, संकलित या निर्मित)।

    __ रचना समारोह:
    समारोह __construct () {// सत्र कार्यों personalizada.session_set_save_handler (सरणी ($ इस, `खुला`), सरणी ($ इस, `करीब`), सरणी ($ इस `पढ़ा`), सरणी ($ सेट यह, `लिखने`), सरणी (इस $, `नष्ट`), सरणी ($ इस `जीसी`)) - // यह लाइन manipulators guardado.register_shutdown_function ( `session_write_close`) प्रभाव के रूप में उपयोग करने पर अप्रत्याशित वस्तुओं से बचाता है - }
  • 3
    एक session_session फ़ंक्शन बनाएँ
    इस फ़ंक्शन को हर बार कहा जाएगा जब कोई session_start () का उपयोग करने के बजाय नया सत्र शुरू करना चाहता है - यह देखने के लिए कोड में टिप्पणियां देखें कि प्रत्येक पंक्ति क्या करती है।

    session_start फ़ंक्शन:
    inicio_sesion समारोह ($ session_name, $ सुरक्षित) {// यकीन है कि सत्र कुकी द्वारा पहुँचा नहीं जा सकता बनाने जावास्क्रिप्ट $ केवल Http = सच -। // sessionid साथ प्रयोग के लिए हैश एल्गोरिथ्म। `SHA512` (प्रयुक्त hash_algos () उपलब्ध हैश की एक सूची देखने के लिए) $ session_hash = - // एक हैश disponibleif के लिए जाँच करें (in_array ($ session_hash, hash_algos ())) {// सेट hash.ini_set समारोह ( `session.hash_function` $ session_hash) -} // चरित्र प्रति कितने बिट hash.// संभावित मान `4` कर रहे हैं (0-9, वायुसेना), `5` (0-9, वी), और ` 6 `(0-9, az, AZ, ";", "") ini_set। (` session.hash_bits_per_character `, 5) - // सत्र कुकीज़ बल केवल, नहीं चर URL.ini_set उपयोग करने के लिए (` session.use_only_cookies `, 1) - // जाओ मापदंडों सत्र कुकी $ cookieParams = session_get_cookie_params () - // parámetrossession_set_cookie_params ($ cookieParams [ "जीवनकाल"], $ cookieParams [ "पथ"], $ cookieParams सेट [ `डोमेन`], $ सुरक्षित, $ Http) - // sesiónsession_name ($ session_name का नाम बदलता है) - // हम अब sesiónsession_start () शुरू कर सकते हैं - // यह लाइन सत्र पुन: बनाता है और anterior.// समाप्त यह बेस में एक नई एन्क्रिप्शन कुंजी भी उत्पन्न करता है डेटा का session_regenerate_id (सच) -}
  • 4
    एक खुला समारोह बनाएँ
    जब आप एक नया सत्र शुरू करते हैं तो PHP सत्र इस फ़ंक्शन को कॉल करेगा, हम इसका उपयोग डेटाबेस में एक नया कनेक्शन शुरू करने के लिए करते हैं।

    खुला समारोह:
    समारोह खुला () {$ मेजबान = `स्थानीय होस्ट` - उपयोगकर्ता $ = `sec_user` - $ पास = `eKcGZr59zAa2BEWU` - $ name = `sesiones_seguras` - $ mysqli = नए mysqli ($ मेजबान, उपयोगकर्ता $, $ पास, $ नाम ) - $ this-> db = $ mysqli-रिटर्न true-}
  • 5
    एक करीबी फ़ंक्शन बनाएं
    इस फ़ंक्शन को तब बुलाया जाएगा जब सत्र बंद होना चाहते हैं।

    Video: Building Apps for Mobile, Gaming, IoT, and more using AWS DynamoDB by Rick Houlihan


    बंद समारोह:
    फ़ंक्शन बंद करें () {$ this-> db-> close () - रिटर्न सच-}



  • 6
    एक पठन फ़ंक्शन बनाएं
    जब आप एक सत्र तक पहुंचने का प्रयास करते हैं तो PHP इस फ़ंक्शन को कॉल करेगा, उदाहरण के लिए जब आप $ _SESSION [`कुछ`] को प्रतिध्वनित करते हैं - चूंकि एक ही पृष्ठ पर इस समारोह में कई कॉल हो सकते हैं, न केवल सुरक्षा के लिए बल्कि प्रदर्शन के लिए तैयार बयान का लाभ उठाएं बस एक बार बयान तैयार करें और फिर उसे कई बार निष्पादित करें।
    यह डेटाबेस में एन्क्रिप्ट किए गए सत्र डेटा को भी डिक्रिप्ट करता है। आप सत्रों में 256-बिट एईएस एन्क्रिप्शन का उपयोग करेंगे।

    फ़ंक्शन पढ़ें:
    समारोह को पढ़ने के ($ आईडी) {अगर (isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> तैयार ( "सत्रों का डेटा का चयन करें जहां आईडी = सीमा 1?") -} $ this-> read_stmt-> bind_param ( `एस`, $ इड) - $ this-> read_stmt-> निष्पादित () - $ this-> read_stmt-> store_result () - $ this-> read_stmt-> bind_result ($ डेटा ) - $ this-> read_stmt-> लाने () - $ कुंजी = $ this-> getkey ($ आईडी) - $ डेटा = $ this-> डिक्रिप्ट ($ डेटा, $ कुंजी) -RETURN $ डेटा-}
  • 7
    एक लेखन समारोह बनाएँ।
    यह फ़ंक्शन किसी सत्र में एक मान निर्दिष्ट करते समय उपयोग किया जाएगा, उदाहरण के लिए $ _SESSION [`कुछ`] = `कुछ और` -। फ़ंक्शन डेटाबेस में सम्मिलित किए जाने वाले सभी डेटा को एन्क्रिप्ट करता है।

    फ़ंक्शन लिखें:
    समारोह लिखने ($ आईडी, $ डेटा) {// एक एकल कुंजी $ कुंजी = $ this-> getKey जाओ ($ इड) - Encrypts डेटा // $ डेटा = $ this-> एन्क्रिप्ट ($ डेटा, $ कुंजी) - $ समय = समय () - अगर (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> तैयार ( "सत्रों में REPLACE (आईडी, समय, डेटा, clave_sesion) मूल्यों ( ? ,,) ") -?} $ this-> w_stmt-> bind_param ( `SISS`, $ आईडी, $ समय, $ डेटा, $ कुंजी) - $ this-> w_stmt-> निष्पादित () - वापसी true-}
  • 8
    एक नष्ट समारोह बनाएँ।
    यह फ़ंक्शन डेटाबेस से सत्र को हटाता है, जब आप session__destroy () जैसे फ़ंक्शन कॉल करते हैं तो यह PHP का उपयोग करता है -

    समारोह को नष्ट कर:
    समारोह को नष्ट ($ आईडी) {अगर (isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> तैयार ( "सत्र से हटाएँ कहां आईडी =?") -} $ इस- > delete_stmt-> bind_param ( `एस`, $ इड) - $ this-> delete_stmt-> निष्पादित () -} वापसी true-
  • 9
    एक जीसी फंक्शन बनाएं (कचरा कलेक्टर, अंग्रेजी में अपने परिवर्णी शब्द के लिए)
    कचरा कलेक्टर फ़ंक्शन को पुराने सत्रों को हटाने के लिए कहा जाता है। आवृत्ति जिसके साथ इस फ़ंक्शन को बुलाया जाता है वह दो कॉन्फ़िगरेशन निर्देशों, session.gc_probability और session.gc_divisor द्वारा निर्धारित किया जाएगा।

    जीसी फ़ंक्शन ():
    समारोह जीसी ($ अधिकतम) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> तैयार ( "सत्र जहां अनुसूची से हटा दें < ? ") -} $ वर्ष = समय () - $ max- $ this-> gc_stmt-> bind_param ( `एस`, $ वर्ष) - $ this-> gc_stmt-> निष्पादित () - true- लौट}
  • 10
    एक गेटकी फंक्शन बनाएं
    यह फ़ंक्शन सत्र तालिका को एन्क्रिप्ट करने के लिए अद्वितीय कुंजी प्राप्त करने के लिए उपयोग किया जाता है। यदि कोई सत्र नहीं है, तो बस एन्क्रिप्ट करने के लिए एक नया यादृच्छिक कुंजी लौटाएं

    गेटकी फ़ंक्शन ():
    निजी समारोह getKey ($ आईडी) {अगर (isset ($ this-> key_stmt)!) {$ this-> key_stmt = $ this-> db-> तैयार ( "सत्र से का चयन करें जहां clave_sesion आईडी = सीमा 1?") - } $ this-> key_stmt-> bind_param ( `एस`, $ इड) - $ this-> key_stmt-> निष्पादित () - $ this-> key_stmt-> store_result () - अगर ($ this-> key_stmt-> NUM_ROWS == 1) {$ this-> key_stmt-> bind_result ($ कुंजी) - $ this-> key_stmt-> लाने () - $ कुंजी वापसी} else {$ random_key = हैश ( `SHA512`, uniqid (mt_rand (1 , mt_getrandmax ()), true)) -}} वापसी $ random_key-
  • 11
    एन्क्रिप्शन और डिक्रिप्शन फ़ंक्शंस बनाएं
    ये कार्य सत्र के डेटा को एन्क्रिप्ट करते हैं जो प्रत्येक सत्र के लिए अलग-अलग डेटाबेस के एन्क्रिप्शन कुंजी के साथ होता है एन्क्रिप्शन कुंजी का उपयोग सीधे नहीं किया जाता है, लेकिन आप कुंजी हैश को और अधिक बेतरतीब ढंग से बनाने के लिए इसका उपयोग करेंगे।

    एन्क्रिप्ट () और डिक्रिप्ट () फ़ंक्शंस:
    निजी एन्क्रिप्ट समारोह ($ डेटा, $ कुंजी) {$ नमक = `सीएच दुर्भाग्य retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = ई @ rAsp7c-पीएचडी @ पीएच!` - $ कुंजी = substr (हैश ( `SHA256`, $ नमक $ कुंजी $।। नमक), 0, 32) - $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB) - $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND) - $ एन्क्रिप्टेड = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ कुंजी, $ डेटा, MCRYPT_MODE_ECB, $ iv)) -RETURN $ encrypted-} निजी समारोह डिक्रिप्ट ($ डेटा, $ कुंजी) {$ नमक = `सीएच दुर्भाग्य ewr4n39 retReGu7W6bEDRup7usuDUh9THeD2CHeGE * = ई @ rAsp7c-पीएच @ पीएच!` - $ कुंजी = substr (हैश ( `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, $ कुंजी, base64_decode ($ डेटा) , MCRYPT_MODE_ECB, $ iv) -RETURN $ decrypted-}
  • 12
    वर्गों को बंद करें
    यहां आप कुंजी के साथ कक्षाओं को बंद कर देते हैं:

    कक्षाएं बंद करें:
    }
  • विधि 3

    सत्र के साथ पेज बनाएं
    1
    कस्टम सत्र प्रबंधक के साथ सत्र का उपयोग करें
    यहां एक नया सत्र शुरू करने का तरीका बताया गया है - आपको इसे उन सभी पृष्ठों में शामिल करना होगा जिन्हें आप सत्रों से एक्सेस करना चाहते हैं, इसे session_start () के बजाय उपयोग करें -

    एक सत्र प्रारंभ करें:
    की आवश्यकता होती है ( `sesion.class.php`) - $ सत्र = नए सत्र () - $ _ सत्र [ `कुछ`] = `एक - // सच में यह रखो अगर आप https का उपयोग करें $ सत्र-> inicio_sesion (झूठे` _ s `) मूल्य। `- प्रतिध्वन $ _SESSION [` कुछ `] -
    सामाजिक नेटवर्क पर साझा करें:

    संबद्ध
    © 2021 ekterya.com