घर दांतों का इलाज php में पंजीकरण लिखें. सरल उपयोगकर्ता पंजीकरण प्रणाली

php में पंजीकरण लिखें. सरल उपयोगकर्ता पंजीकरण प्रणाली

नमस्ते! अब हम साइट पर सरलतम पंजीकरण लागू करने का प्रयास करेंगे PHP का उपयोग करना+ MySQL. ऐसा करने के लिए, अपाचे को आपके कंप्यूटर पर इंस्टॉल करना होगा। हमारी स्क्रिप्ट का कार्य सिद्धांत नीचे दिखाया गया है।

1. आइए डेटाबेस में एक उपयोगकर्ता तालिका बनाकर शुरुआत करें। इसमें उपयोगकर्ता डेटा (लॉगिन और पासवर्ड) होगा। आइए phpmyadmin पर जाएं (यदि आप अपने पीसी पर डेटाबेस बना रहे हैं http://localhost/phpmyadmin/). हम एक तालिका उपयोगकर्ता बनाते हैं, इसमें 3 फ़ील्ड होंगे।

मैं इसे MySQL डेटाबेस में बनाता हूं, आप इसे किसी अन्य डेटाबेस में बना सकते हैं। इसके बाद, मानों को चित्र के अनुसार सेट करें:

2. इस तालिका से कनेक्शन आवश्यक है. आइए एक bd.php फ़ाइल बनाएँ। इसकी सामग्री:

मेरे मामले में यह इस तरह दिखता है:

bd.php सहेजें।
महान! हमारे पास डेटाबेस में एक तालिका और उससे एक कनेक्शन है। अब आप एक पेज बनाना शुरू कर सकते हैं जिस पर उपयोगकर्ता अपना डेटा छोड़ेंगे।

3. सामग्री के साथ एक reg.php फ़ाइल बनाएं (सभी टिप्पणियाँ अंदर):



पंजीकरण


पंजीकरण


अपना लॉगिन:




आपका पासवर्ड:








4. एक फ़ाइल बनाएं जो डेटाबेस में डेटा दर्ज करेगी और उपयोगकर्ता को बचाएगी। save_user.php (अंदर टिप्पणियाँ):

5. अब हमारे उपयोगकर्ता पंजीकरण कर सकते हैं! इसके बाद, आपको साइट में प्रवेश करने के लिए पहले से पंजीकृत उपयोगकर्ताओं के लिए एक "दरवाजा" बनाना होगा। Index.php (अंदर टिप्पणियाँ):




होम पेज


होम पेज


अपना लॉगिन:


आपका पासवर्ड:






पंजीकरण करवाना



ठीक है अब सब ख़त्म हो गया! पाठ उबाऊ हो सकता है, लेकिन बहुत उपयोगी है। यहां केवल पंजीकरण का विचार दिखाया गया है, तो आप इसे सुधार सकते हैं: सुरक्षा, डिज़ाइन, डेटा फ़ील्ड जोड़ें, अवतार लोड करना, अपने खाते से लॉग आउट करना (ऐसा करने के लिए, बस अनसेट फ़ंक्शन के साथ सत्र से चर को नष्ट करें) और जल्द ही। आपको कामयाबी मिले!

मैंने सब कुछ जाँच लिया, यह ठीक से काम करता है!

आज हम लोकप्रिय सीएमएस जूमला में एक महत्वपूर्ण 1-दिवसीय भेद्यता के शोषण को देखेंगे, जो अक्टूबर के अंत में इंटरनेट पर फैल गया था। हम CVE-2016-8869, CVE-2016-8870 और CVE-2016-9081 नंबरों वाली कमजोरियों के बारे में बात करेंगे। ये तीनों कोड के एक टुकड़े से आते हैं, जो पाँच है लंबे वर्षों तकढाँचे की गहराइयों में निस्तेज, पंखों में इंतजार कर रहा है, तभी मुक्त होकर अपने साथ अराजकता, हैक की गई साइटों और इस जूमला के निर्दोष उपयोगकर्ताओं के आँसू लेकर आता है। केवल सबसे बहादुर और साहसी डेवलपर्स, जिनकी आंखें मॉनिटर की रोशनी से लाल थीं, और जिनके कीबोर्ड ब्रेड के टुकड़ों से अटे पड़े थे, उग्र बुरी आत्माओं को चुनौती देने और सुधार की वेदी पर अपना सिर रखने में सक्षम थे।

चेतावनी सभी जानकारी केवल सूचनात्मक उद्देश्यों के लिए प्रदान की गई है। इस लेख की सामग्री से होने वाले किसी भी संभावित नुकसान के लिए न तो संपादक और न ही लेखक जिम्मेदार हैं। जहां से यह सब शुरू हुआ

6 अक्टूबर 2016 को, डेमिस पाल्मा ने स्टैक एक्सचेंज पर एक विषय बनाया जिसमें उन्होंने पूछा: क्यों, वास्तव में, जूमला संस्करण 3.6 में एक ही नाम रजिस्टर() के साथ उपयोगकर्ताओं को पंजीकृत करने के दो तरीके हैं? पहला UserControllerRegistration कंट्रोलर में है और दूसरा UsersControllerUser कंट्रोलर में है। डेमिस जानना चाहता था कि क्या UsersControllerUser::register() विधि का उपयोग कहीं किया गया था, या क्या यह पुराने तर्क से बचा हुआ एक विकासवादी कालभ्रम था। उनकी चिंता यह थी कि भले ही इस पद्धति का उपयोग किसी भी दृष्टिकोण से नहीं किया जाता है, फिर भी इसे एक गढ़ी गई क्वेरी द्वारा बुलाया जा सकता है। जिस पर मुझे इटोक्टोपस उपनाम के तहत एक डेवलपर से प्रतिक्रिया मिली, जिसने पुष्टि की: समस्या वास्तव में मौजूद है। और जूमला डेवलपर्स को एक रिपोर्ट भेजी।

तब घटनाएँ सबसे तेजी से विकसित हुईं। 18 अक्टूबर को, जूमला डेवलपर्स ने डेमिस की रिपोर्ट स्वीकार कर ली, जिसने उस समय तक एक पीओसी का मसौदा तैयार कर लिया था जो उपयोगकर्ता पंजीकरण की अनुमति देगा। उन्होंने अपनी वेबसाइट पर एक नोट प्रकाशित किया, जिसमें सामान्य रूपरेखाउन्होंने पाई गई समस्या और इस मामले पर अपने विचारों के बारे में बात की। उसी दिन बाहर आ रहे हैं एक नया संस्करणजूमला 3.6.3, जिसमें अभी भी असुरक्षित कोड है।

इसके बाद, डेविड टैम्पेलिनी बग को तब तक घुमाता है जब तक कि यह पंजीकृत न हो जाए साधारण उपयोगकर्ता, और प्रशासक। और 21 अक्टूबर को जूमला सुरक्षा टीम के पास एक नया मामला आता है। इसमें पहले से ही विशेषाधिकार बढ़ाने की बात कही गई है. उसी दिन, जूमला वेबसाइट पर एक घोषणा दिखाई देती है कि मंगलवार, 25 अक्टूबर को सीरियल नंबर 3.6.3 के साथ अगला संस्करण जारी किया जाएगा, जो सिस्टम कर्नेल में एक महत्वपूर्ण भेद्यता को ठीक करता है।

25 अक्टूबर जूमला सिक्योरिटी स्ट्राइक टीम को डेमिस द्वारा खोजे गए कोड के टुकड़े द्वारा बनाई गई नवीनतम समस्या का पता चला। फिर 21 अक्टूबर को अस्पष्ट नाम प्रिपेयर 3.6.4 स्टेबल रिलीज़ के साथ एक कमिट को आधिकारिक जूमला रिपॉजिटरी की मुख्य शाखा में धकेल दिया जाता है, जो दुर्भाग्यपूर्ण बग को ठीक करता है।

इसके सामने आने के बाद, कई इच्छुक व्यक्ति डेवलपर समुदाय में शामिल हो जाते हैं - वे भेद्यता को बढ़ावा देना और कारनामे तैयार करना शुरू कर देते हैं।

27 अक्टूबर को, शोधकर्ता हैरी रॉबर्ट्स ने Xiphos रिसर्च रिपॉजिटरी में एक तैयार-निर्मित शोषण अपलोड किया है जो एक कमजोर सीएमएस वाले सर्वर पर एक PHP फ़ाइल अपलोड कर सकता है।

विवरण

खैर, पृष्ठभूमि खत्म हो गई है, आइए सबसे दिलचस्प भाग पर चलते हैं - भेद्यता का विश्लेषण। मैंने जूमला 3.6.3 को एक परीक्षण संस्करण के रूप में स्थापित किया है, इसलिए सभी पंक्ति संख्याएँ इस संस्करण के लिए प्रासंगिक होंगी। और फ़ाइलों के सभी पथ जो आप नीचे देखेंगे, स्थापित सीएमएस की जड़ के सापेक्ष इंगित किए जाएंगे।

डेमिस पाल्मा की खोज के लिए धन्यवाद, हम जानते हैं कि दो विधियाँ हैं जो सिस्टम में उपयोगकर्ता पंजीकरण करती हैं। पहला सीएमएस द्वारा उपयोग किया जाता है और फ़ाइल /components/com_users/controllers/registration.php:108 में स्थित होता है। दूसरा (जिसे हमें कॉल करने की आवश्यकता होगी) /components/com_users/controllers/user.php:293 में रहता है। आइए इस पर करीब से नज़र डालें।

286: /** 287: * उपयोगकर्ता को पंजीकृत करने की विधि। 288: * 289: * @रिटर्न बूलियन 290: * 291: * @सिंस 1.6 292: */ 293: पब्लिक फंक्शन रजिस्टर() 294: (295: JSession::checkToken("post") या jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // फॉर्म डेटा प्राप्त करें: $ डेटा = $ यह-> इनपुट-> पोस्ट-> प्राप्त करें ("उपयोगकर्ता", सरणी (), "सरणी"); 315: $रिटर्न = $मॉडल->वैलिडेट($फॉर्म, $डेटा); 316: 317: // त्रुटियों की जांच करें 318: यदि ($रिटर्न === गलत) 319: (...345: // पंजीकरण समाप्त करें 346: $वापसी = $मॉडल->रजिस्टर($डेटा);

यहाँ मैंने केवल दिलचस्प पंक्तियाँ छोड़ी हैं। असुरक्षित विधि का पूर्ण संस्करण जूमला रिपॉजिटरी में देखा जा सकता है।

आइए जानें कि सामान्य उपयोगकर्ता पंजीकरण के दौरान क्या होता है: कौन सा डेटा भेजा जाता है और इसे कैसे संसाधित किया जाता है। यदि सेटिंग्स में उपयोगकर्ता पंजीकरण सक्षम है, तो फॉर्म http://joomla.local/index.php/component/users/?view=registration पर पाया जा सकता है।


एक वैध उपयोगकर्ता पंजीकरण अनुरोध निम्नलिखित स्क्रीनशॉट जैसा दिखता है।


com_users घटक उपयोगकर्ताओं के साथ काम करने के लिए जिम्मेदार है। अनुरोध में कार्य पैरामीटर पर ध्यान दें. इसका प्रारूप $controller.$method है। आइए फ़ाइल संरचना को देखें।

नियंत्रक फ़ोल्डर में स्क्रिप्ट के नाम, बुलाए गए नियंत्रकों के नाम से मेल खाते हैं। चूंकि हमारे अनुरोध में अब $controller = "registration" है, इसलिए रजिस्ट्रेशन.php फ़ाइल और इसकी रजिस्टर() विधि को कॉल किया जाएगा।

ध्यान दें, प्रश्न: पंजीकरण प्रसंस्करण को कोड में कमजोर स्थान पर कैसे स्थानांतरित किया जाए? आपने शायद इसका अनुमान पहले ही लगा लिया होगा। कमजोर और वास्तविक तरीकों के नाम समान हैं (रजिस्टर), इसलिए हमें केवल बुलाए गए नियंत्रक का नाम बदलने की जरूरत है। हमारा असुरक्षित नियंत्रक कहाँ स्थित है? यह सही है, user.php फ़ाइल में। यह $controller = "user" निकला। सब कुछ एक साथ रखने पर हमें Task = user.register मिलता है। अब पंजीकरण अनुरोध को उस विधि द्वारा संसाधित किया जाता है जिसकी हमें आवश्यकता है।


दूसरी चीज़ जो हमें करने की ज़रूरत है वह है डेटा को सही प्रारूप में भेजना। यहां सब कुछ सरल है. वैध रजिस्टर() हमसे jform नामक एक सरणी की अपेक्षा करता है, जिसमें हम पंजीकरण डेटा - नाम, लॉगिन, पासवर्ड, ईमेल पास करते हैं (अनुरोध के साथ स्क्रीनशॉट देखें)।

  • /components/com_users/controllers/registration.php: 124: // उपयोगकर्ता डेटा प्राप्त करें। 125: $requestData = $this->input->post->get("jform", array(), "array");

हमारे क्लाइंट को यह डेटा उपयोगकर्ता नामक सरणी से प्राप्त होता है।

  • /components/com_users/controllers/user.php: 301: // फॉर्म डेटा प्राप्त करें। 302: $डेटा = $यह->इनपुट->पोस्ट->प्राप्त करें("उपयोगकर्ता", सरणी(), "सरणी");

इसलिए, हम अनुरोध में सभी मापदंडों के नाम jfrom से user में बदल देते हैं।

हमारा तीसरा कदम एक वैध सीएसआरएफ टोकन ढूंढना है, क्योंकि इसके बिना कोई पंजीकरण नहीं होगा।

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") या jexit(JText::_("JINVALID_TOKEN"));

यह MD5 हैश जैसा दिखता है, और आप इसे, उदाहरण के लिए, साइट /index.php/component/users/?view=login पर प्राधिकरण फॉर्म से ले सकते हैं।


अब आप वांछित विधि का उपयोग करके उपयोगकर्ता बना सकते हैं। यदि सब कुछ काम कर गया, तो बधाई हो - आपने CVE-2016-8870 "नए उपयोगकर्ताओं को पंजीकृत करने के लिए अनुपलब्ध अनुमति जांच" भेद्यता का फायदा उठाया।

UsersControllerRegistration नियंत्रक से "कार्यशील" रजिस्टर() विधि में यह ऐसा दिखता है:

  • /components/com_users/controllers/registration.php: 113: // यदि पंजीकरण अक्षम है - लॉगिन पृष्ठ पर रीडायरेक्ट करें। 114: यदि (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= लॉगिन", गलत)); 117: 118: गलत वापसी; 119: )

और इसलिए असुरक्षित में:

  • /components/com_users/controllers/user.php:

हाँ, बिलकुल नहीं.

दूसरी, कहीं अधिक गंभीर समस्या को समझने के लिए, आइए अपने द्वारा बनाया गया अनुरोध भेजें और देखें कि इसे कोड के विभिन्न भागों में कैसे निष्पादित किया जाता है। यहां वह हिस्सा है जो कार्यकर्ता विधि में उपयोगकर्ता द्वारा सबमिट किए गए डेटा को मान्य करने के लिए जिम्मेदार है:

निरंतरता केवल सदस्यों के लिए उपलब्ध है विकल्प 1। साइट पर सभी सामग्रियों को पढ़ने के लिए "साइट" समुदाय में शामिल हों

निर्दिष्ट अवधि के भीतर समुदाय में सदस्यता आपको सभी हैकर सामग्रियों तक पहुंच प्रदान करेगी, आपकी व्यक्तिगत संचयी छूट बढ़ाएगी और आपको एक पेशेवर Xakep स्कोर रेटिंग जमा करने की अनुमति देगी!

लारवेल को प्रोजेक्ट निर्भरताओं को प्रबंधित करने के लिए कंपोज़र की आवश्यकता होती है। इसलिए लारवेल इंस्टॉल करने से पहले, सुनिश्चित करें कि आपके सिस्टम पर कंपोज़र इंस्टॉल है। यदि आप पहली बार कंपोज़र के बारे में सुन रहे हैं, तो यह नोड के एनपीएम के समान PHP के लिए एक निर्भरता प्रबंधन उपकरण है।

अपनी मशीन पर कंपोज़र स्थापित करने के लिए, इस पोस्ट को देखें:

विंडोज़ पर लारवेल इंस्टॉल करना:

विंडोज़ मशीन पर लार्वा स्थापित करने के लिए नीचे दिए गए चरणों का पालन करें। इससे कोई फर्क नहीं पड़ता कि आपके पास xampp/wamp स्टैक है, यह दोनों के लिए काम करता है। WAMP पर, "www" फ़ोल्डर और XAMPP पर, जाहिर तौर पर "htdocs" पर लार्वा इंस्टॉल करना सुनिश्चित करें।

चरण-1) XAMPP पर "htdocs" फ़ोल्डर खोलें, SHIFT कुंजी दबाए रखें और फ़ोल्डर पर राइट क्लिक करें, और "यहां कमांड विंडो खोलें" चुनें। वैकल्पिक रूप से, आप कमांड विंडो खोल सकते हैं और निर्देशिका को "xampp/htdocs" में बदल सकते हैं।

चरण-2) निम्नलिखित कमांड दर्ज करें।

संगीतकार क्रिएट-प्रोजेक्ट लारवेल/लारवेल my_laravel_site --prefer-dist

यहां "my_laravel_site" फ़ोल्डर नाम है जहां लार्वा फ़ाइलें स्थापित की जाएंगी। इसे अपनी पसंद के अनुसार बदलें.

चरण-3) अब धैर्य रखने का समय है क्योंकि लार्वा इंस्टॉलेशन में कुछ समय लगने वाला है।

चरण-4) एक बार इंस्टॉल हो जाने पर, कमांड प्रॉम्प्ट पर निर्देशिका को "my_laravel_site" (सीडी "my_laravel_site") में बदलें और नीचे दिए गए कमांड को दर्ज करें।

पीएचपी कारीगर सेवा

चरण-5) यह एक यूआरएल के साथ कुछ इस तरह का एक संदेश दिखाएगा, "लारवेल डेवलपमेंट सर्वर शुरू हुआ:"।

चरण-6) यूआरएल को कॉपी करके ब्राउज़र पर पेस्ट करें। यदि चीजें सही होती हैं, तो आपको लार्वा स्वागत स्क्रीन दिखाई देगी।

चरण-7) हो गया! आपने विंडोज़ मशीन पर सफलतापूर्वक लारवेल स्थापित कर लिया है और इसके साथ जाने के लिए तैयार हैं।

एप्लिकेशन कुंजी सेट करना:

स्थापना के बाद लारवेल को कम कॉन्फ़िगरेशन की आवश्यकता होती है। इसके लिए आपको एप्लिकेशन कुंजी सेट करने की आवश्यकता है। यह 32 अक्षरों की एक यादृच्छिक स्ट्रिंग है जिसका उपयोग सत्र और अन्य संवेदनशील डेटा को एन्क्रिप्ट करने के लिए किया जाता है। जब आप कंपोज़र या लारवेल इंस्टॉलर के माध्यम से लारवेल इंस्टॉल करते हैं तो आमतौर पर यह स्वचालित रूप से सेट हो जाएगा।

यदि यह सेट नहीं है, तो आपको इसे मैन्युअल रूप से करना होगा। सबसे पहले अपने एप्लिकेशन रूट पर ".env.example" फ़ाइल का नाम बदलकर ".env" करना सुनिश्चित करें। फिर कमांड प्रॉम्प्ट खोलें और लार्वा प्रोजेक्ट फ़ोल्डर में बदलें। अब कुंजी उत्पन्न करने के लिए नीचे दिया गया कमांड चलाएँ।

Php कारीगर कुंजी: उत्पन्न करें

इस जेनरेट की गई कुंजी को ".env" फ़ाइल पर APP_KEY वेरिएबल में कॉपी करें। सहेजें और आपका काम हो गया.

विशिष्ट लारवेल संस्करण स्थापित करना:

ऊपर दी गई विधि कंपोजर को लारवेल का नवीनतम संस्करण डाउनलोड और इंस्टॉल करने में सक्षम बनाएगी। यदि आप अपनी मशीन पर लार्वा के पुराने संस्करण स्थापित करना चाहते हैं, तो क्रिएट-प्रोजेक्ट कमांड पर संबंधित संस्करण संख्या शामिल करना सुनिश्चित करें।

संगीतकार क्रिएट-प्रोजेक्ट लारवेल/लारवेल=5.4 आपका-प्रोजेक्ट-नाम --prefer-dist यह भी पढ़ें:

वैसे ही आप भी कर सकते हैं विंडोज़ पर कंपोज़र का उपयोग करके आसानी से लार्वा इंस्टॉल करें. मुझे आशा है कि आपको यह ट्यूटोरियल उपयोगी लगेगा। अगर आपको यह पसंद आए तो कृपया इसे अपने सोशल सर्कल पर साझा करें।

पंजीकरण प्रणाली बनाने की प्रक्रिया काफी कठिन है। आपको एक कोड लिखना होगा जो ईमेल पते की वैधता की दोबारा जांच करेगा, पुष्टिकरण ईमेल भेजेगा, पासवर्ड पुनर्प्राप्त करने की क्षमता प्रदान करेगा, पासवर्ड संग्रहीत करेगा सुरक्षित जगह, जांचे गए इनपुट फॉर्म और भी बहुत कुछ। जब आप यह सब करते हैं, तब भी उपयोगकर्ता पंजीकरण करने में अनिच्छुक होंगे, क्योंकि सबसे न्यूनतम पंजीकरण के लिए भी उनकी गतिविधि की आवश्यकता होती है।

आज के ट्यूटोरियल में, हम एक सरल पंजीकरण प्रणाली विकसित करेंगे जिसके लिए किसी पासवर्ड की आवश्यकता नहीं होगी! परिणाम एक ऐसी प्रणाली होगी जिसे मौजूदा PHP वेबसाइट में आसानी से संशोधित या एकीकृत किया जा सकता है। यदि आप रुचि रखते हैं, तो पढ़ते रहें।

पीएचपी

अब हम PHP कोड के साथ शुरुआत करने के लिए तैयार हैं। पंजीकरण प्रणाली की मुख्य कार्यक्षमता उपयोगकर्ता वर्ग द्वारा प्रदान की जाती है, जिसे आप नीचे देख सकते हैं। कक्षा () का उपयोग करती है, जो एक न्यूनतम डेटाबेस लाइब्रेरी है। उपयोगकर्ता वर्ग डेटाबेस तक पहुँचने, लॉगिन टोकन उत्पन्न करने और उन्हें मान्य करने के लिए जिम्मेदार है। यह हमें एक सरल इंटरफ़ेस प्रस्तुत करता है जिसे आपकी PHP आधारित वेबसाइटों की पंजीकरण प्रणाली में आसानी से शामिल किया जा सकता है।

उपयोगकर्ता.वर्ग.php

// निजी ओआरएम उदाहरण
निजी $orm;

/**
* टोकन स्ट्रिंग द्वारा उपयोगकर्ता ढूंढें। केवल वैध टोकन ही लिए जाते हैं
* सोच-विचार। एक टोकन जनरेट होने के बाद 10 मिनट के लिए वैध होता है।
* @परम स्ट्रिंग $टोकन खोजने के लिए टोकन
* @वापसी उपयोगकर्ता
*/

सार्वजनिक स्थैतिक फ़ंक्शन findByToken($टोकन)(

// इसे डेटाबेस में ढूंढें और सुनिश्चित करें कि टाइमस्टैम्प सही है


->कहाँ("टोकन", $टोकन)
->where_raw("टोकन_वैधता > अभी()")
->find_one();

यदि(!$परिणाम)(
विवरण झूठा है;
}

नया उपयोगकर्ता लौटाएं($परिणाम);
}

/**
* या तो लॉगिन करें या उपयोगकर्ता को पंजीकृत करें।
* @वापसी उपयोगकर्ता
*/

सार्वजनिक स्थैतिक फ़ंक्शन लॉगिनऑररजिस्टर($ईमेल)(

// यदि ऐसा कोई उपयोगकर्ता पहले से मौजूद है, तो उसे वापस कर दें

यदि(उपयोगकर्ता::मौजूद($ईमेल))(
नया उपयोगकर्ता लौटाएं($ईमेल);
}

// अन्यथा, इसे बनाएं और इसे वापस कर दें

उपयोगकर्ता लौटाएं::बनाएं($ईमेल);
}

/**
* एक नया उपयोगकर्ता बनाएं और उसे डेटाबेस में सहेजें
* @परम स्ट्रिंग $ईमेल उपयोगकर्ता का ईमेल पता
* @वापसी उपयोगकर्ता
*/

निजी स्थैतिक फ़ंक्शन बनाएँ($ईमेल)(

// डेटाबेस में एक नया उपयोगकर्ता लिखें और उसे लौटाएँ

$परिणाम = ORM::for_table("reg_users")->create();
$परिणाम->ईमेल = $ईमेल;
$परिणाम->सहेजें();

नया उपयोगकर्ता लौटाएं($परिणाम);
}

/**
* जांचें कि क्या ऐसा कोई उपयोगकर्ता डेटाबेस में मौजूद है और एक बूलियन लौटाएं।
* @परम स्ट्रिंग $ईमेल उपयोगकर्ता का ईमेल पता
* @रिटर्न बूलियन
*/

सार्वजनिक स्थैतिक फ़ंक्शन मौजूद है($ईमेल)(

// क्या उपयोगकर्ता डेटाबेस में मौजूद है?
$परिणाम = ORM::for_table("reg_users")
->कहाँ("ईमेल", $ईमेल)
->गिनती();

वापसी $ परिणाम == 1;
}

/**
* एक नया उपयोगकर्ता ऑब्जेक्ट बनाएं
* @param $param ORM इंस्टेंस, आईडी, ईमेल या शून्य
* @वापसी उपयोगकर्ता
*/

सार्वजनिक फ़ंक्शन __construct($param = null)(

यदि($परम इंस्टेंसऑफ ORM)(

// एक ORM उदाहरण पारित किया गया था
$यह->ओआरएम = $परम;
}
अन्यथा यदि(is_string($param))(

// एक ईमेल पारित किया गया था
$यह->
->कहां('ईमेल', $परम)
->find_one();
}
अन्य(

यदि(is_numeric($param))(
// एक उपयोगकर्ता आईडी को एक पैरामीटर के रूप में पारित किया गया था
$आईडी = $परम;
}
अन्यथा यदि(isset($_SESSION["loginid"]))(

// कोई उपयोगकर्ता आईडी पारित नहीं की गई, सत्र देखें
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->कहां('आईडी', $आईडी)
->find_one();
}

/**
* एक नया SHA1 लॉगिन टोकन जेनरेट करता है, इसे डेटाबेस में लिखता है और वापस लौटाता है।
* @वापसी स्ट्रिंग
*/

सार्वजनिक फ़ंक्शन जनरेटटोकन())(
// लॉग इन उपयोगकर्ता के लिए एक टोकन उत्पन्न करें। इसे डेटाबेस में सहेजें.

$टोकन = sha1($this->email.time().rand(0, 1000000));

// टोकन को डेटाबेस में सहेजें,
// और इसे केवल अगले 10 मिनट के लिए वैध के रूप में चिह्नित करें

$this->orm->set("टोकन", $टोकन);
$this->orm->set_expr("टोकन_वैधता", "ADDTIME(NOW(),"0:10")");
$this->orm->save();

$टोकन लौटाएँ;
}

/**
*इस उपयोगकर्ता को लॉगिन करें
* @वापसी शून्य
*/

सार्वजनिक फ़ंक्शन लॉगिन()

// उपयोगकर्ता को लॉग इन के रूप में चिह्नित करें
$_SESSION["loginid"] = $this->orm->id;

// Last_login db फ़ील्ड को अपडेट करें
$this->orm->set_expr('last_login', 'NOW()');
$this->orm->save();
}

/**
* सत्र को नष्ट करें और उपयोगकर्ता को लॉगआउट करें।
* @वापसी शून्य
*/

सार्वजनिक फ़ंक्शन लॉगआउट()
$_सत्र = सरणी();
अनसेट($_SESSION);
}

/**
* जांचें कि उपयोगकर्ता लॉग इन है या नहीं।
* @रिटर्न बूलियन
*/

सार्वजनिक फ़ंक्शन लॉगइन())(
वापसी जारी($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* जांचें कि क्या उपयोगकर्ता प्रशासक है
* @रिटर्न बूलियन
*/

सार्वजनिक फ़ंक्शन isAdmin())(
वापसी $यह->रैंक() == "प्रशासक";
}

/**
* उपयोगकर्ता का प्रकार ढूंढें. यह या तो व्यवस्थापक या नियमित हो सकता है।
* @वापसी स्ट्रिंग
*/

सार्वजनिक समारोह रैंक()
अगर($यह->ओआरएम->रैंक == 1)(
वापसी "प्रशासक";
}

वापसी "नियमित";
}

/**
* निजी के तत्वों तक पहुँचने की जादुई विधि
* उपयोगकर्ता ऑब्जेक्ट के गुणों के रूप में $orm उदाहरण
* @param string $key एक्सेस की गई प्रॉपर्टी का नाम
* @मिश्रित वापसी
*/

सार्वजनिक समारोह __get($key)(
if(isset($this->orm->$key))(
वापसी $this->orm->$key;
}

वापसी शून्य;
}
}
टोकन एक एल्गोरिदम का उपयोग करके उत्पन्न होते हैं और एक डेटाबेस में संग्रहीत होते हैं। हम टोकन_वैलिडिटी कॉलम को 10 मिनट पर सेट करने के लिए MySQL का उपयोग करते हैं। टोकन को सत्यापित करते समय, हम इंजन को बताते हैं कि हमें टोकन की आवश्यकता है, टोकन_वैलिडिटी फ़ील्ड अभी तक समाप्त नहीं हुई है। इस तरह हम उस समय को सीमित कर देते हैं जिसके दौरान टोकन वैध होगा।

ध्यान दें कि हम उपयोगकर्ता ऑब्जेक्ट के गुणों तक पहुंचने के लिए दस्तावेज़ के अंत में __get() जादुई विधि का उपयोग करते हैं। यह हमें डेटाबेस में गुणों के रूप में संग्रहीत डेटा तक पहुंचने की अनुमति देता है: $user->email, $user->टोकन। उदाहरण के तौर पर, आइए देखें कि हम निम्नलिखित कोड स्निपेट में इस वर्ग का उपयोग कैसे कर सकते हैं:


एक अन्य फ़ाइल जो आवश्यक कार्यक्षमता को संग्रहीत करती है वह function.php है। वहां हमारे पास कुछ सहायक फ़ंक्शन हैं जो हमें बाकी कोड को साफ-सुथरा रखने की अनुमति देते हैं।

फ़ंक्शंस.php

फ़ंक्शन भेजें_ईमेल($से, $से, $विषय, $संदेश)(

// ईमेल भेजने के लिए सहायक कार्य

$हेडर = "एमआईएमई-संस्करण: 1.0"। "\r\n";
$headers .= "सामग्री-प्रकार: text/plain; charset=utf-8"। "\r\n";
$headers .= "From: ".$from . "\r\n";

वापसी मेल($से, $विषय, $संदेश, $शीर्षलेख);
}

फ़ंक्शन get_page_url())(

// PHP फ़ाइल का URL ढूंढें

$url = "http"।(खाली($_SERVER["HTTPS"])?"":"s")।"://"।$_SERVER["SERVER_NAME"];

यदि(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")(
$url.= $_SERVER["REQUEST_URI"];
}
अन्य(
$url.= $_SERVER["PATH_INFO"];
}

वापसी $यूआरएल;
}

फ़ंक्शन रेट_लिमिट($आईपी, $लिमिट_घंटा = 20, $लिमिट_10_मिनट = 10)(

// इस आईपी पते द्वारा पिछले घंटे में लॉगिन प्रयासों की संख्या

$count_hour = ORM::for_table("reg_login_attempt")
->
->where_raw('ts > SUBTIME(NOW(),'1:00''))
->गिनती();

// इस आईपी पते द्वारा पिछले 10 मिनट में लॉगिन प्रयासों की संख्या

$count_10_min = ORM::for_table("reg_login_attempt")
->कहाँ('आईपी', स्प्रिंटफ('%u', ip2long($ip)))
->where_raw('ts > SUBTIME(NOW(),'0:10''))
->गिनती();

यदि($गिनती_घंटा > $सीमा_घंटा || $गिनती_10_मिनट > $सीमा_10_मिनट)(
नया अपवाद फेंकें ("बहुत सारे लॉगिन प्रयास!");
}
}

फ़ंक्शन रेट_लिमिट_टिक($आईपी, $ईमेल)(

// लॉगिन प्रयास तालिका में एक नया रिकॉर्ड बनाएं

$login_attempt = ORM::for_table("reg_login_attempt")->create();

$login_attempt->ईमेल = $ईमेल;
$login_attempt->ip = sprintf("%u", ip2long($ip));

$login_attempt->save();
}

फ़ंक्शन रीडायरेक्ट($यूआरएल)(
हेडर ("स्थान: $url");
बाहर निकलना;
}
रेट_लिमिट और रेट_लिमिट_टिक फ़ंक्शन हमें एक निश्चित अवधि के लिए प्राधिकरण प्रयासों की संख्या को सीमित करने की अनुमति देते हैं। प्राधिकरण प्रयास reg_login_attempt डेटाबेस में दर्ज किए जाते हैं। लॉगिन फॉर्म सत्यापित होने पर ये फ़ंक्शन ट्रिगर हो जाते हैं, जैसा कि आप निम्नलिखित कोड स्निपेट में देख सकते हैं।

नीचे दिया गया कोड Index.php से लिया गया है और यह लॉगिन फॉर्म को मान्य करने के लिए जिम्मेदार है। यह एक JSON प्रतिक्रिया देता है जो jQuery कोड द्वारा संचालित होती है जिसे हमने संपत्तियों/js/script.js में देखा था।

Index.php

यदि(!खाली($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))(

// एक JSON हेडर आउटपुट करें

हेडर ("सामग्री-प्रकार: एप्लिकेशन/जेसन");

// क्या ईमेल पता वैध है?

यदि(!isset($_POST["ईमेल"]) || !filter_var($_POST["ईमेल"], FILTER_VALIDATE_EMAIL))(
नया अपवाद फेंकें ("कृपया एक वैध ईमेल दर्ज करें।");
}

// यदि व्यक्ति ऊपर है तो यह एक अपवाद फेंक देगा
// अनुमत लॉगिन प्रयास सीमाएँ (अधिक के लिए function.php देखें):
रेट_लिमिट($_सर्वर["REMOTE_ADDR"]);

// इस लॉगिन प्रयास को रिकॉर्ड करें
रेट_लिमिट_टिक($_SERVER["REMOTE_ADDR"], $_POST["ईमेल"]);

// उपयोगकर्ता को संदेश भेजें

$संदेश = "";
$ईमेल = $_POST["ईमेल"];
$विषय = "आपका लॉगिन लिंक";

यदि(!उपयोगकर्ता::मौजूद($ईमेल))(
$विषय = "पंजीकरण के लिए धन्यवाद!";
$message = "हमारी साइट पर पंजीकरण करने के लिए धन्यवाद!\n\n";
}

// व्यक्ति को लॉगिन या पंजीकृत करने का प्रयास करें
$user = User::loginOrRegister($_POST["email"]);

$message.= "आप इस URL से लॉगइन कर सकते हैं:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "लिंक 10 मिनट के बाद स्वचालित रूप से समाप्त हो जाएगा।";

$परिणाम = भेजें_ईमेल($सेमेल, $_POST["ईमेल"], $विषय, $संदेश);

यदि(!$परिणाम)(
नया अपवाद फेंकें ("आपका ईमेल भेजने में त्रुटि हुई थी। कृपया पुनः प्रयास करें।");
}

डाई(json_encode(सरणी(
"संदेश" => "धन्यवाद! हमने आपके इनबॉक्स में एक लिंक भेजा है। अपना स्पैम फ़ोल्डर भी जांचें।"
)));
}
}
पकड़ो(अपवाद $e)(

डाई(json_encode(सरणी(
"त्रुटि"=>1,
"संदेश" => $e->getMessage()
)));
}
सफल प्राधिकरण या पंजीकरण पर, उपरोक्त कोड प्राधिकरण के लिए एक लिंक के साथ व्यक्ति को एक ईमेल भेजता है। जनरेट किए गए URL के कारण टोकन को $_GET वेरिएबल "tkn" के रूप में उपलब्ध कराया गया है।

Index.php

यदि(जारी($_GET["tkn"]))(

// क्या यह वैध लॉगिन टोकन है?
$user = User::findByToken($_GET["tkn"]);

// हाँ! उपयोगकर्ता को लॉगिन करें और संरक्षित पृष्ठ पर रीडायरेक्ट करें।

$user->लॉगिन();
रीडायरेक्ट ("संरक्षित.php");
}

// अमान्य टोकन। लॉगिन फॉर्म पर वापस रीडायरेक्ट करें।
रीडायरेक्ट ("index.php");
}
$user->login() चलाने से आवश्यक सत्र चर तैयार हो जाएंगे, जिससे उपयोगकर्ता बाद के लॉगिन पर लॉग इन रह सकेगा।

सिस्टम से लॉग आउट करना लगभग उसी तरह लागू किया जाता है:

Index.php

यदि(जारी($_GET["लॉगआउट"]))(

$उपयोगकर्ता = नया उपयोगकर्ता();

यदि($उपयोगकर्ता->लॉगइन())(
$user->लॉगआउट();
}

रीडायरेक्ट('index.php');
}
कोड के अंत में, हम उपयोगकर्ता को फिर से Index.php पर रीडायरेक्ट करते हैं, इसलिए URL में ?logout=1 पैरामीटर समाप्त हो जाता है।

हमारी Index.php फ़ाइल को भी सुरक्षा की आवश्यकता होगी - हम नहीं चाहते कि पहले से लॉग इन उपयोगकर्ता फ़ॉर्म देखें। ऐसा करने के लिए हम $user->loggedIn() विधि का उपयोग करते हैं:

Index.php

$उपयोगकर्ता = नया उपयोगकर्ता();

अगर($उपयोगकर्ता->लॉगइन())(
रीडायरेक्ट ("संरक्षित.php");
}
अंत में, आइए देखें कि आप अपने वेबसाइट पेज को कैसे सुरक्षित रख सकते हैं और इसे प्राधिकरण के बाद ही पहुंच योग्य बना सकते हैं:

संरक्षित.php

// अपनी साइट पर किसी भी php पेज को सुरक्षित रखने के लिए, main.php शामिल करें
// और एक नया उपयोगकर्ता ऑब्जेक्ट बनाएं। यह इतना आसान है!

require_once "includes/main.php";

$उपयोगकर्ता = नया उपयोगकर्ता();

अगर(!$उपयोगकर्ता->लॉगइन())(
रीडायरेक्ट ("index.php");
}
इस जांच के बाद, आप सुनिश्चित हो सकते हैं कि उपयोगकर्ता सफलतापूर्वक लॉग इन हो गया है। आपके पास उस डेटा तक भी पहुंच होगी जो डेटाबेस में $user ऑब्जेक्ट के गुणों के रूप में संग्रहीत है। उपयोगकर्ता का ईमेल और उनकी रैंक प्रदर्शित करने के लिए, निम्नलिखित कोड का उपयोग करें:

इको "आपका ईमेल: ".$user->ईमेल;
इको "आपकी रैंक: ".$user->रैंक();
यहां रैंक() विधि है क्योंकि डेटाबेस में रैंक कॉलम में आमतौर पर संख्याएं होती हैं (नियमित उपयोगकर्ताओं के लिए 0 और प्रशासकों के लिए 1) और हमें इन सभी को रैंक नामों में परिवर्तित करने की आवश्यकता है, जिसे इसका उपयोग करके कार्यान्वित किया जाता है यह विधि. एक मानक उपयोगकर्ता को व्यवस्थापक में बदलने के लिए, बस phpmyadmin (या किसी अन्य डेटाबेस प्रोग्राम) में उपयोगकर्ता की प्रविष्टि को संपादित करें। व्यवस्थापक के रूप में, उपयोगकर्ता के पास कोई अधिकार नहीं होगा विशेष लक्षण. आपको स्वयं यह चुनने का अधिकार है कि प्रशासकों को क्या अधिकार देने हैं।

तैयार!

इसके साथ ही हमारी सरल पंजीकरण प्रणाली तैयार है! आप इसे मौजूदा PHP साइट पर उपयोग कर सकते हैं, या अपनी आवश्यकताओं के अनुरूप इसे आधुनिक बना सकते हैं।

Reg.ru: डोमेन और होस्टिंग

रूस में सबसे बड़ा रजिस्ट्रार और होस्टिंग प्रदाता।

सेवा में 2 मिलियन से अधिक डोमेन नाम।

प्रमोशन, डोमेन मेल, व्यावसायिक समाधान।

दुनिया भर में 700 हजार से अधिक ग्राहक पहले ही अपनी पसंद बना चुके हैं।

*स्क्रॉलिंग रोकने के लिए माउस को ऊपर ले जाएँ।

पीछे की ओर आगे की ओर

PHP और MySQL में एक सरल उपयोगकर्ता पंजीकरण प्रणाली बनाना

पंजीकरण प्रणाली बनाना बहुत काम का काम है। आपको कोड लिखना होगा जो ईमेल पते को मान्य करता है, पंजीकरण की पुष्टि करने वाला एक ईमेल भेजता है, और अन्य फॉर्म फ़ील्ड को भी मान्य करता है, और भी बहुत कुछ।

और आपके यह सब लिखने के बाद भी, उपयोगकर्ता पंजीकरण करने में अनिच्छुक होंगे, क्योंकि... इसके लिए उनकी ओर से कुछ प्रयास की आवश्यकता है।

इस ट्यूटोरियल में, हम एक बहुत ही सरल पंजीकरण प्रणाली बनाएंगे जिसमें पासवर्ड की बिल्कुल भी आवश्यकता या भंडारण की आवश्यकता नहीं होगी! परिणाम को संशोधित करना और मौजूदा PHP साइट में जोड़ना आसान होगा। जानना चाहते हैं कि यह कैसे काम करता है? नीचे पढ़ें।



यहां बताया गया है कि हमारी सुपर सरल प्रणाली कैसे काम करेगी:

हम प्राधिकरण प्रपत्र और पंजीकरण को जोड़ देंगे। इस फॉर्म में आपका ईमेल पता दर्ज करने के लिए एक फ़ील्ड और एक पंजीकरण बटन होगा;
- ईमेल पते के साथ फ़ील्ड भरते समय, पंजीकरण बटन पर क्लिक करने से नए उपयोगकर्ता के बारे में एक रिकॉर्ड बन जाएगा, लेकिन केवल तभी जब दर्ज किया गया ईमेल पता डेटाबेस में नहीं मिला हो।

इसके बाद, वर्णों का एक यादृच्छिक अद्वितीय सेट (टोकन) बनाया जाता है, जिसे उपयोगकर्ता द्वारा निर्दिष्ट ईमेल पर एक लिंक के रूप में भेजा जाता है जो 10 मिनट के लिए प्रासंगिक होगा;
- लिंक उपयोगकर्ता को हमारी वेबसाइट पर ले जाता है। सिस्टम टोकन की उपस्थिति निर्धारित करता है और उपयोगकर्ता को अधिकृत करता है;

इस दृष्टिकोण के लाभ:

पासवर्ड संग्रहीत करने या फ़ील्ड मान्य करने की कोई आवश्यकता नहीं है;
- आपका पासवर्ड, सुरक्षा प्रश्न आदि पुनर्प्राप्त करने की कोई आवश्यकता नहीं है;
- जिस क्षण कोई उपयोगकर्ता पंजीकरण/लॉग इन करता है, आप हमेशा सुनिश्चित हो सकते हैं कि यह उपयोगकर्ता आपके एक्सेस क्षेत्र में होगा (ईमेल पता सत्य है);
- अविश्वसनीय रूप से सरल पंजीकरण प्रक्रिया;

कमियां:

उपयोगकर्ता खाता सुरक्षा. यदि किसी के पास उपयोगकर्ता के मेल तक पहुंच है, तो वे लॉग इन कर सकते हैं।
- ईमेल सुरक्षित नहीं है और उसे रोका जा सकता है। ध्यान रखें कि यह प्रश्न उस स्थिति में भी प्रासंगिक है जहां पासवर्ड भूल गया है और उसे पुनर्स्थापित करने की आवश्यकता है, या किसी प्राधिकरण प्रणाली में जो डेटा ट्रांसफर (लॉगिन/पासवर्ड) के लिए HTTPS का उपयोग नहीं करता है;
- जब आप अपने मेल सर्वर को ठीक से कॉन्फ़िगर करते हैं, तो संभावना है कि प्राधिकरण लिंक वाले संदेश स्पैम में समाप्त हो जाएंगे;

हमारे सिस्टम के फायदे और नुकसान की तुलना करते हुए, हम कह सकते हैं कि सिस्टम में उच्च उपयोगिता (अंतिम उपयोगकर्ता के लिए अधिकतम सुविधा) है और साथ ही, कम सुरक्षा संकेतक भी है।

इसलिए इसे उन मंचों और सेवाओं पर पंजीकरण के लिए उपयोग करने का सुझाव दिया गया है जो महत्वपूर्ण जानकारी के साथ काम नहीं करते हैं।

इस सिस्टम का उपयोग कैसे करें

यदि आपको अपनी साइट पर उपयोगकर्ताओं को अधिकृत करने के लिए किसी सिस्टम का उपयोग करने की आवश्यकता है, और आप इस पाठ को टुकड़ों में नहीं लेना चाहते हैं, तो आपको यहां क्या करना है:

आपको पाठ से जुड़े स्रोतों को डाउनलोड करना होगा
- संग्रह में tables.sql फ़ाइल ढूंढें। phpMyAdmin में आयात विकल्प का उपयोग करके इसे अपने डेटाबेस में आयात करें। वैकल्पिक तरीका: इस फ़ाइल को इसके माध्यम से खोलें पाठ संपादक, SQL क्वेरी की प्रतिलिपि बनाएँ और उसे निष्पादित करें;
- include/main.php खोलें और अपने डेटाबेस से जुड़ने के लिए सेटिंग्स भरें (डेटाबेस से जुड़ने के लिए उपयोगकर्ता और पासवर्ड, साथ ही होस्ट और डेटाबेस का नाम निर्दिष्ट करें)। उसी फ़ाइल में, आपको ईमेल भी निर्दिष्ट करना होगा, जिसका उपयोग सिस्टम द्वारा भेजे गए संदेशों के मूल पते के रूप में किया जाएगा। कुछ होस्ट आउटगोइंग ईमेल को तब तक ब्लॉक कर देते हैं जब तक कि फॉर्म में वास्तविक ईमेल पता न हो, जो होस्ट के नियंत्रण कक्ष से बनाया गया हो, इसलिए वास्तविक पता प्रदान करें;
- अपने होस्ट पर FTP के माध्यम से सभी Index.php, संरक्षित.php फ़ाइलें और संपत्तियाँ और फ़ोल्डर्स अपलोड करें;
- प्रत्येक PHP पेज पर नीचे दिया गया कोड जोड़ें जहां आप लॉगिन फॉर्म प्रदर्शित करना चाहते हैं;

Require_once "includes/main.php"; $उपयोगकर्ता = नया उपयोगकर्ता(); यदि(!$user->loggedIn())(रीडायरेक्ट("index.php"); )
- तैयार!

जो लोग इसमें रुचि रखते हैं कि यह सब कैसे काम करता है, उनके लिए नीचे पढ़ें!

पहला कदम प्राधिकरण फॉर्म के लिए एचटीएम कोड लिखना है। यह कोड Index.php फ़ाइल में स्थित है। इस फ़ाइल में PHP कोड भी है जो फॉर्म डेटा और अन्य उपयोगी लॉगिन सिस्टम फ़ंक्शंस को संभालता है। आप PHP कोड समीक्षा के लिए समर्पित नीचे दिए गए अनुभाग में इसके बारे में अधिक जान सकते हैं।

Index.php

ट्यूटोरियल: PHP और MySQL लॉगिन या रजिस्टर के साथ सुपर सरल पंजीकरण प्रणाली

ऊपर अपना ईमेल पता दर्ज करें और हम भेज देंगे
आप एक लॉगिन लिंक.

लॉगिन/रजिस्टर करें

मुख्य अनुभाग में (और टैग के बीच) मैंने मुख्य शैलियों को शामिल किया है (वे इस ट्यूटोरियल में शामिल नहीं हैं, इसलिए आप उन्हें स्वयं देख सकते हैं। फ़ोल्डर संपत्ति/सीएसएस/स्टाइल.सीएसएस)। समापन टैग से पहले, मैंने jQuery लाइब्रेरी और स्क्रिप्ट.जेएस फ़ाइल शामिल की, जिसे हम नीचे लिखेंगे और विश्लेषण करेंगे।


जावास्क्रिप्ट

jQuery फ़ंक्शन का उपयोग करके "रजिस्टर/लॉगिन" बटन की स्थिति को ट्रैक करता है e.preventDefault()और AJAX अनुरोध भेजता है। सर्वर प्रतिक्रिया के आधार पर, यह एक या दूसरा संदेश प्रदर्शित करता है और निर्धारित करता है आगे की कार्रवाई/

संपत्ति/जेएस/स्क्रिप्ट.जेएस

$(function())( var form = $("#login-register"); form.on("submit", function(e)( if(form.is("।loading, .loggedIn"))( return गलत ;) var ईमेल = form.find("input").val(), messageHolder = form.find("span"); $.post(this.action, (email: email), function (m)( if (m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder. text(m.message ); ) )); $(document).ajaxStart(function())( form.addClass('loading'); )); $(document).ajaxComplete(function())( form. ;

प्रदर्शित करने के लिए प्रपत्र में जोड़ा गया है वर्तमान स्थिति AJAX अनुरोध (यह विधियों के कारण संभव हुआ अजाक्सस्टार्ट()) और अजाक्सपूर्ण(), जिसे आप फ़ाइल के अंत में पा सकते हैं)।

यह वर्ग एक घूमती हुई एनिमेटेड GIF फ़ाइल प्रदर्शित करता है (जैसे कि हमें संकेत देता है कि अनुरोध संसाधित किया जा रहा है), और फॉर्म को दोबारा सबमिट होने से रोकने के लिए एक ध्वज के रूप में भी कार्य करता है (जब रजिस्टर बटन पहले ही एक बार क्लिक किया जा चुका हो)। .loggedIn वर्ग एक अन्य ध्वज है - यह तब सेट किया जाता है जब ईमेल भेजा गया था। यह फ़्लैग फ़ॉर्म के साथ किसी भी आगे की कार्रवाई को तुरंत रोक देता है।

डेटाबेस स्कीमा

हमारा अविश्वसनीय रूप से सरल लॉगिंग सिस्टम 2 MySQL तालिकाओं का उपयोग करता है (SQL कोड tables.sql फ़ाइल में है)। पहला उपयोगकर्ता खातों के बारे में डेटा संग्रहीत करता है। दूसरा लॉगिन प्रयासों की संख्या के बारे में जानकारी संग्रहीत करता है।


उपयोगकर्ता तालिका स्कीमा.

सिस्टम पासवर्ड का उपयोग नहीं करता है, जैसा कि चित्र में देखा जा सकता है। इस पर आप टोकन_वैलिडिटी कॉलम से सटे टोकन वाला टोकन कॉलम देख सकते हैं। जैसे ही उपयोगकर्ता सिस्टम से जुड़ता है और संदेश भेजने के लिए अपना ईमेल सेट करता है, टोकन इंस्टॉल हो जाता है (अगले ब्लॉक में इस पर अधिक जानकारी)। टोकन_वैधता कॉलम 10 मिनट बाद का समय निर्धारित करता है, जिसके बाद टोकन मान्य नहीं होता है।


तालिका स्कीमा जो प्राधिकरण प्रयासों की संख्या की गणना करती है।

दोनों तालिकाओं में, आईपी पते को पूर्णांक प्रकार के क्षेत्र में ip2long फ़ंक्शन का उपयोग करके संसाधित रूप में संग्रहीत किया जाता है।

अब हम कुछ PHP कोड लिख सकते हैं। सिस्टम की मुख्य कार्यक्षमता वर्ग User.class.php को सौंपी गई है, जिसे आप नीचे देख सकते हैं।

यह वर्ग सक्रिय रूप से idorm (docs) का उपयोग करता है, ये लाइब्रेरी डेटाबेस के साथ काम करने के लिए न्यूनतम आवश्यक उपकरण हैं। यह डेटाबेस एक्सेस, टोकन जेनरेशन और टोकन सत्यापन को संभालता है। यह एक सरल इंटरफ़ेस प्रदान करता है जो PHP का उपयोग करने पर पंजीकरण प्रणाली को आपकी साइट से कनेक्ट करना आसान बनाता है।

उपयोगकर्ता.वर्ग.php

क्लास उपयोगकर्ता (//निजी ORM केस निजी $orm; /** * टोकन द्वारा उपयोगकर्ता ढूंढें। केवल वैध टोकन ही विचार के लिए स्वीकार किए जाते हैं। टोकन बनाए जाने के क्षण से केवल 10 मिनट के लिए उत्पन्न होता है * @param स्ट्रिंग $टोकन यह वह टोकन है जिसकी हम तलाश कर रहे हैं * @रिटर्न उपयोगकर्ता। उपयोगकर्ता फ़ंक्शन का मान लौटाएं */ सार्वजनिक स्थैतिक फ़ंक्शन ढूंढें बायटोकन($टोकन)( // डेटाबेस में टोकन ढूंढें और सुनिश्चित करें कि सही टाइमस्टैम्प सेट है। परिणाम = ORM::for_table("reg_users") ->where ("टोकन", $टोकन) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) नया उपयोगकर्ता लौटाएं($परिणाम) /** *); उपयोगकर्ता को अधिकृत या पंजीकृत करें * @परम स्ट्रिंग $ईमेल। उपयोगकर्ता ईमेल पता * @रिटर्न उपयोगकर्ता */ सार्वजनिक स्थैतिक फ़ंक्शन लॉगिनऑररजिस्टर($ईमेल)( // यदि ऐसा उपयोगकर्ता है पहले से मौजूद है, डेटाबेस में संग्रहीत निर्दिष्ट ईमेल पते से उपयोगकर्ता फ़ंक्शन का मान लौटाएं यदि (उपयोगकर्ता:: मौजूद है ($ ईमेल)) ( नया उपयोगकर्ता लौटाएं ($ ईमेल); ) // अन्यथा, इसमें एक नया उपयोगकर्ता बनाएं डेटाबेस और निर्दिष्ट ईमेल रिटर्न से User::create फ़ंक्शन का मान लौटाएं User::create($email ); ) /** * एक नया उपयोगकर्ता बनाएं और डेटाबेस में सहेजें * @param string $email. उपयोगकर्ता ईमेल पता * @वापसी उपयोगकर्ता */ निजी स्थैतिक फ़ंक्शन बनाएं ($ईमेल)( // एक नया उपयोगकर्ता लिखें और इन मानों से उपयोगकर्ता फ़ंक्शन का परिणाम लौटाएं $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); जांचें कि क्या ऐसा कोई उपयोगकर्ता डेटाबेस में मौजूद है और इसका बूलियन मान लौटाएं वेरिएबल * @परम स्ट्रिंग $ईमेल। उपयोगकर्ता ईमेल पता * @रिटर्न बूलियन */ सार्वजनिक स्थैतिक फ़ंक्शन मौजूद है ($ ईमेल) ( // क्या उपयोगकर्ता डेटाबेस में मौजूद है? $ परिणाम = ORM::for_table ("reg_users") -> कहाँ ("ईमेल", $ ईमेल ) ->गणना(); वापसी $परिणाम == 1; ) /** * एक नया उपयोगकर्ता ऑब्जेक्ट बनाएं * @param उदाहरण $param ORM, आईडी, ईमेल या 0 * @वापसी उपयोगकर्ता */ सार्वजनिक फ़ंक्शन __construct($param = शून्य) ( if($param इंस्टेंसऑफ ORM)( // ORM चेक पास हो गया $this->orm = $param; ) अन्यथा if(is_string($param))( // ईमेल चेक पास हो गया $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // वेरिएबल $param $ का मान आईडी उपयोगकर्ता पहचानकर्ता को भेज दी गई है = $param; ) else if(isset($_SESSION["loginid"]))( // अन्यथा, सत्र देखें $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one() ) ) /** * एक नया SHA1 प्राधिकरण टोकन जेनरेट करें, इसे डेटाबेस में लिखें और इसका मान लौटाएं * @ रिटर्न स्ट्रिंग */ सार्वजनिक फ़ंक्शन जेनरेटटोकन()( // अधिकृत उपयोगकर्ता के लिए एक टोकन जेनरेट करें और इसे डेटाबेस में सहेजें $टोकन = sha1($this->email.time().rand(0, 1000000)); // डेटाबेस में टोकन सहेजें // और इसे चिह्नित करें ताकि यह केवल अगले 10 मिनट के लिए वैध हो $this->orm->set("token", $token); $this->orm->set_expr("टोकन_वैधता", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); $टोकन लौटाएँ; ) /** * उपयोगकर्ता को अधिकृत करें * @return void */ सार्वजनिक फ़ंक्शन लॉगिन())( // उपयोगकर्ता को लॉग इन के रूप में चिह्नित करें $_SESSION["loginid"] = $this->orm->id; // अपडेट करें अंतिम_लॉगिन डेटाबेस फ़ील्ड का मान $this->orm->set_expr('last_login', 'NOW()'); $this->orm->save() ) /** * सत्र को नष्ट करें और उपयोगकर्ता को लॉग आउट करें * @return void */ सार्वजनिक फ़ंक्शन लॉगआउट ()( $_SESSION = array(); unset($_SESSION); ) /** * जांचें कि क्या उपयोगकर्ता लॉग इन है * @return बूलियन */ सार्वजनिक फ़ंक्शन loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id ) /** * जांचता है कि उपयोगकर्ता प्रशासक है या नहीं * @return boolean */ सार्वजनिक फ़ंक्शन isAdmin())( return $this->rank() = = "administrator"; ) /** * उपयोगकर्ता प्रकार ढूंढें, या तो व्यवस्थापक या नियमित हो सकता है * @return string */ सार्वजनिक फ़ंक्शन रैंक())( यदि( $this->orm->रैंक == 1)( रिटर्न "एडमिनिस्ट्रेटर" "; ) रिटर्न "रेगुलर"; ) /** * वह विधि जो आपको उपयोगकर्ता की निजी जानकारी प्राप्त करने की अनुमति देती है * उपयोगकर्ता ऑब्जेक्ट के गुणों के रूप में * @param स्ट्रिंग $key उस प्रॉपर्टी का नाम जिसे एक्सेस मिलता है * @return Mixed */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm->$ चाबी; ) शून्य वापसी; ) )

टोकन SHA1 एल्गोरिदम का उपयोग करके उत्पन्न किए जाते हैं और डेटाबेस में संग्रहीत किए जाते हैं। मैं टोकन की वैधता के लिए 10 मिनट की समय सीमा निर्धारित करने के लिए MySQL के टाइमिंग फ़ंक्शन का उपयोग कर रहा हूं।

जब कोई टोकन मान्य किया जाता है, तो हम सीधे हैंडलर को बताते हैं कि हम केवल उन टोकन पर विचार कर रहे हैं जो अभी तक समाप्त नहीं हुए हैं, जो टोकन_वैलिडिटी कॉलम में संग्रहीत हैं।

कृपया ध्यान दें कि मैं जादुई विधि का उपयोग कर रहा हूं __पानाउपयोगकर्ता ऑब्जेक्ट के गुणों तक पहुंच को रोकने के लिए फ़ाइल के अंत में डॉक्स लाइब्रेरी।

इसके लिए धन्यवाद, $user->email, $user->टोकन आदि गुणों के कारण डेटाबेस में संग्रहीत जानकारी तक पहुंचना संभव हो जाता है। अगले कोड खंड में, हम देखेंगे कि इन वर्गों को एक उदाहरण के रूप में कैसे उपयोग किया जाए। .


संरक्षित पृष्ठ

एक अन्य फ़ाइल जो उपयोगी और आवश्यक कार्यक्षमता संग्रहीत करती है, वह function.php फ़ाइल है। कई तथाकथित सहायक-सहायक फ़ंक्शन हैं जो आपको अन्य फ़ाइलों में क्लीनर और अधिक पठनीय कोड बनाने की अनुमति देते हैं।

फ़ंक्शन.php

फ़ंक्शन भेजें_ईमेल($से, $से, $विषय, $संदेश)( // सहायक जो ईमेल भेजता है $हेडर = "एमआईएमई-संस्करण: 1.0" . "\r\n"; $हेडर .= "सामग्री-प्रकार: पाठ /plain; charset=utf-8" . "\r\n"; $headers .= "From: ".$from . "\r\n"; return mail($to, $subject, $message, $headers ); ) फ़ंक्शन get_page_url())( // PHP फ़ाइल URL निर्धारित करें $url = "http"।(empty($_SERVER["HTTPS"])?"":"s")।"://"।$ _सर्वर ["SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) अन्यथा( $url . = $_SERVER["PATH_INFO"] ) रिटर्न $url; फ़ंक्शन रेट_लिमिट($ip, $limit_hour = 20, $limit_10_min = 10)( // इस आईपी पते के लिए अंतिम घंटे में लॉगिन प्रयासों की संख्या $count_hour = ORM : :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00")" ) ->गिनती(); // इस आईपी पते के लिए पिछले 10 मिनट में लॉगिन प्रयासों की संख्या $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long ($ आईपी))) ->where_raw('ts > SUBTIME(NOW(),'0:10'''') ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( नया अपवाद फेंकें ("बहुत सारे लॉगिन प्रयास!"); ) ) फ़ंक्शन रेट_लिमिट_टिक($ip, $email)( // तालिका में एक नया रिकॉर्ड बनाएं वह लॉगिन प्रयासों की संख्या की गणना करता है $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save(); ) फ़ंक्शन रीडायरेक्ट($url)( हेडर('स्थान: $url'); बाहर निकलें; )

कार्य कीमत सीमाऔर रेट_लिमिट_टिकपहले प्रयास के बाद से बीते समय में प्राधिकरण प्रयासों की संख्या की निगरानी करें। लॉगिन प्रयास डेटाबेस में reg_login_attempt कॉलम में दर्ज किया गया है। जब प्रपत्र डेटा संसाधित और सबमिट किया जाता है तो इन फ़ंक्शन को कॉल किया जाता है जैसा कि आप निम्नलिखित कोड स्निपेट से देख सकते हैं।

नीचे दिया गया कोड Index.php फ़ाइल से लिया गया है और यह फ़ॉर्म सबमिशन को संभालता है। यह एक JSON प्रतिक्रिया देता है, जिसे बदले में jQuery द्वारा एसेट/जेएस/स्क्रिप्ट.जेएस फ़ाइल में संसाधित किया जाता है जिसे हमने पहले देखा था।

Index.php

प्रयास करें( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // एक JSON हेडर हेडर आउटपुट करें ("सामग्री-प्रकार: एप्लिकेशन/json"); // क्या यह ईमेल पता मान्य है यदि (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( नया अपवाद फेंकें ("कृपया एक वैध ईमेल दर्ज करें।"); ) // जाँच करें उपयोगकर्ता को लॉग इन करने की अनुमति है, क्या उसने अनुमत कनेक्शनों की संख्या पार कर ली है? (अधिक जानकारी के लिए function.php फ़ाइल) रेट_लिमिट($_SERVER["REMOTE_ADDR"]); // इस प्राधिकरण प्रयास को रिकॉर्ड करें रेट_लिमिट_टिक($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // उपयोगकर्ता को एक ईमेल भेजें $message = ""; $email = $_POST["email"]; $subject = "आपका लॉगिन लिंक" )( $subject = " पंजीकरण करने के लिए धन्यवाद! ); $message.= "आप इस URL से लॉगइन कर सकते हैं:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "लिंक 10 मिनट के बाद स्वचालित रूप से समाप्त हो जाएगा।"; $परिणाम = भेजें_ईमेल($सेमेल, $_POST["ईमेल"], $विषय, $संदेश); if(!$result)( नया अपवाद फेंकें("आपका ईमेल भेजने में त्रुटि हुई थी। कृपया पुनः प्रयास करें।"); )die(json_encode(array("message" => "धन्यवाद! हमने\"एक लिंक भेजा है अपने इनबॉक्स में अपना स्पैम फ़ोल्डर भी जांचें। )));

सफल लॉगिन/पंजीकरण के बाद, उपरोक्त कोड उपयोगकर्ता को एक लॉगिन लिंक भेजेगा। टोकन उपलब्ध हो जाता है क्योंकि इसे विधि द्वारा जेनरेट किए गए लिंक में एक वेरिएबल के रूप में पारित किया जाता है $_प्राप्त करेंटीकेएन मार्कर के साथ

Index.php

यदि(isset($_GET["tkn"]))( // क्या यह टोकन प्राधिकरण के लिए वैध है? $user = User::findByToken($_GET["tkn"]); if($user)( // हाँ , है। संरक्षित पेज पर रीडायरेक्ट करें $user->login(); रीडायरेक्ट('protected.php'); // नहीं, टोकन मान्य नहीं है। प्राधिकरण/पंजीकरण फॉर्म रीडायरेक्ट के साथ पेज पर रीडायरेक्ट करें )

$उपयोगकर्ता->लॉगिन()

सत्र के लिए आवश्यक वैरिएबल बनाएगा, ताकि साइट के बाद के पृष्ठों को देखने वाला उपयोगकर्ता हर समय अधिकृत बना रहे।

सिस्टम से बाहर निकलने के लिए फ़ंक्शन की प्रोसेसिंग को इसी तरह से व्यवस्थित किया जाता है।

Index.php

यदि(जारी($_GET["लॉगआउट"]))( $उपयोगकर्ता = नया उपयोगकर्ता(); यदि($उपयोगकर्ता->लॉगइन())( $उपयोगकर्ता->लॉगआउट(); ) रीडायरेक्ट("index.php") ; )

कोड के अंत में, मैंने फिर से Index.php पर रीडायरेक्ट सेट किया, इसलिए पैरामीटर ?लॉगआउट=1यूआरएल के माध्यम से प्रेषित करना आवश्यक नहीं है।

हमारी Index.php फ़ाइल को अतिरिक्त की आवश्यकता है। सुरक्षा - हम नहीं चाहते कि जिन लोगों ने सिस्टम में लॉग इन किया है वे पंजीकरण फॉर्म दोबारा देखें। इन उद्देश्यों के लिए, हम विधि का उपयोग करते हैं $उपयोगकर्ता->लॉगइन().

Index.php

$उपयोगकर्ता = नया उपयोगकर्ता(); अगर($user->लॉगइन())(रीडायरेक्ट("protected.php"); )

अंत में, यहां कोड का एक टुकड़ा है जो आपको अपनी साइट के पृष्ठों की सुरक्षा करने और प्राधिकरण के बाद ही इसे पहुंच योग्य बनाने की अनुमति देता है।

संरक्षित.php

// अपनी साइट पर प्रत्येक पृष्ठ की सुरक्षा के लिए, एक main.php फ़ाइल // शामिल करें और एक नया उपयोगकर्ता ऑब्जेक्ट बनाएं। यह कितना आसान है! require_once "includes/main.php"; $उपयोगकर्ता = नया उपयोगकर्ता(); अगर(!$user->लॉगइन())(रीडायरेक्ट("index.php"); )

इस जाँच के बाद, आप सुनिश्चित हो सकते हैं कि उपयोगकर्ता सफलतापूर्वक अधिकृत किया गया था। आप ऑब्जेक्ट गुणों का उपयोग करके डेटाबेस में संग्रहीत जानकारी तक भी पहुंच सकते हैं $उपयोगकर्ता. उपयोगकर्ता का ईमेल और स्थिति प्रदर्शित करने के लिए, इस कोड का उपयोग करें:

इको "आपका ईमेल: ".$user->ईमेल; इको "आपकी रैंक: ".$user->रैंक();

तरीका पद()यहां उपयोग किया जाता है क्योंकि डेटाबेस आमतौर पर संख्याओं को संग्रहीत करता है (एक नियमित उपयोगकर्ता के लिए 0, एक व्यवस्थापक के लिए 1) और हमें इस डेटा को उन स्थितियों में परिवर्तित करने की आवश्यकता होती है जिनसे वे संबंधित हैं, जिसमें यह विधि हमारी मदद करती है।

एक नियमित उपयोगकर्ता को प्रशासक बनाने के लिए, बस phpMyAdmin (या कोई अन्य प्रोग्राम जो आपको डेटाबेस प्रबंधित करने की अनुमति देता है) के माध्यम से उपयोगकर्ता प्रविष्टि को संपादित करें। इस उदाहरण में व्यवस्थापक स्थिति कोई विशेषाधिकार नहीं देती है, पृष्ठ प्रदर्शित करेगा कि आप एक व्यवस्थापक हैं - और बस इतना ही।

लेकिन इसके साथ क्या करना है यह आपके विवेक पर छोड़ दिया गया है, आप स्वयं कोड लिख और संकलित कर सकते हैं जो प्रशासकों के लिए कुछ विशेषाधिकार और क्षमताएं निर्धारित करता है।

किए गए!

हमने इस अविश्वसनीय सुपर अर्ध सरल आकार का काम पूरा कर लिया है! आप इसे अपनी PHP साइटों में उपयोग कर सकते हैं, यह काफी सरल है। आप इसे अपने लिए संशोधित भी कर सकते हैं और जैसा चाहें वैसा बना सकते हैं।

सामग्री डेनिस मैलिशोक द्वारा विशेष रूप से वेबसाइट वेबसाइट के लिए तैयार की गई थी

पी.एस. क्या आप PHP और OOP में महारत हासिल करना चाहते हैं? वेबसाइट निर्माण के विभिन्न पहलुओं पर प्रीमियम पाठों पर ध्यान दें, जिसमें PHP में प्रोग्रामिंग भी शामिल है, साथ ही OOP का उपयोग करके PHP में अपना स्वयं का सीएमएस सिस्टम बनाने पर एक निःशुल्क पाठ्यक्रम भी शामिल है:

क्या आपको सामग्री पसंद आई और आप मुझे धन्यवाद देना चाहते हैं?
बस अपने दोस्तों और सहकर्मियों के साथ साझा करें!




साइट पर नया

>

सबसे लोकप्रिय