PHP रजिस्टर_ग्लोबल्स पैरामीटर को सक्षम करना खतरनाक क्यों है? PHP और MySQL इंपर्सनल इंडेक्स 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 (अंदर टिप्पणियाँ):




होम पेज


होम पेज


अपना लॉगिन:


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






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



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

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

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"); e.preventDefault(); $.post(this.action, (ईमेल: ईमेल), फ़ंक्शन (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()) ( फॉर्म. रिमूवक्लास("लोड हो रहा है"); )); ));

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

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

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

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


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

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


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

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

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

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

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

क्लास उपयोगकर्ता (//निजी ORM केस निजी $orm; /** * टोकन द्वारा उपयोगकर्ता ढूंढें। केवल वैध टोकन ही विचार के लिए स्वीकार किए जाते हैं। टोकन बनाए जाने के क्षण से केवल 10 मिनट के लिए उत्पन्न होता है * @param स्ट्रिंग $टोकन . यह वह टोकन है जिसकी हम तलाश कर रहे हैं * @रिटर्न यूजर, यूजर फ़ंक्शन का मान लौटाएं */ सार्वजनिक स्थैतिक फ़ंक्शन ढूंढें बायटोकन($टोकन)( // डेटाबेस में टोकन ढूंढें और सुनिश्चित करें कि सही टाइमस्टैम्प सेट है $result = ORM::for_table("reg_users") ->where ("टोकन", $टोकन) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) नया उपयोगकर्ता लौटाएं($परिणाम); ) /** * उपयोगकर्ता को अधिकृत या पंजीकृत करें * @param स्ट्रिंग $ईमेल। उपयोगकर्ता ईमेल पता * @उपयोगकर्ता लौटाएं */ सार्वजनिक स्थैतिक फ़ंक्शन लॉगिनऑररजिस्टर($ईमेल)( // यदि ऐसा उपयोगकर्ता पहले से ही है मौजूद है, डेटाबेस में संग्रहीत निर्दिष्ट ईमेल पते से उपयोगकर्ता फ़ंक्शन का मान लौटाएं यदि (उपयोगकर्ता:: मौजूद है ($ ईमेल)) ( नया उपयोगकर्ता लौटाएं ($ ईमेल); ) // अन्यथा, डेटाबेस में एक नया उपयोगकर्ता बनाएं और निर्दिष्ट ईमेल से User::create फ़ंक्शन का मान लौटाएं User::create($email ); ) /** * एक नया उपयोगकर्ता बनाएं और डेटाबेस में सहेजें * @param string $email. उपयोगकर्ता का ईमेल पता * @वापसी उपयोगकर्ता */ निजी स्थैतिक फ़ंक्शन बनाएं ($ईमेल)( // एक नया उपयोगकर्ता लिखें और इन मानों से उपयोगकर्ता फ़ंक्शन का परिणाम लौटाएं $result = ORM::for_table("reg_users")- >बनाएं(); $परिणाम->ईमेल = $ईमेल; $परिणाम->सहेजें(); नया उपयोगकर्ता लौटाएं($परिणाम); ) /** * जांचें कि क्या ऐसा उपयोगकर्ता डेटाबेस में मौजूद है और बूलियन मान लौटाएं वेरिएबल * @param स्ट्रिंग $email. उपयोगकर्ता ईमेल पता * @रिटर्न बूलियन */ सार्वजनिक स्थैतिक फ़ंक्शन मौजूद है ($ ईमेल) ( // क्या उपयोगकर्ता डेटाबेस में मौजूद है? $ परिणाम = 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 का मान है उपयोगकर्ता पहचानकर्ता को पारित $id = $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 */ public फ़ंक्शन isAdmin())( return $this->rank() = = "administrator"; ) /** * उपयोगकर्ता प्रकार ढूंढें, या तो व्यवस्थापक या नियमित हो सकता है * @return string */ सार्वजनिक फ़ंक्शन रैंक())( यदि ($this->orm->रैंक == 1)( रिटर्न "एडमिनिस्ट्रेटर" "; ) रिटर्न "रेगुलर"; ) /** * वह विधि जो आपको उपयोगकर्ता की निजी जानकारी को * उपयोगकर्ता ऑब्जेक्ट के गुणों के रूप में प्राप्त करने की अनुमति देती है * @ परम स्ट्रिंग $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"; रिटर्न मेल($to, $subject, $message, $headers ); ) फ़ंक्शन get_page_url())( // PHP फ़ाइल का URL निर्धारित करें $url = "http"।(empty($_SERVER["HTTPS"])?"":"s")।"://" .$_SERVER ["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($ ip))) ->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 = "आपका लॉगिन लिंक"; if(!User:: मौजूद है($ईमेल) )( $विषय = "पंजीकरण करने के लिए धन्यवाद!"; $संदेश = "हमारी साइट पर पंजीकरण करने के लिए धन्यवाद!\n\n"; ) // उपयोगकर्ता को अधिकृत या पंजीकृत करने का प्रयास $उपयोगकर्ता = उपयोगकर्ता ::loginOrRegister($_POST[ "email"]); $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 "); )

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

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

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

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 में अपना स्वयं का सीएमएस सिस्टम बनाने पर एक निःशुल्क पाठ्यक्रम भी शामिल है:

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


इस तथ्य के कारण कि अक्सर वैश्विक चर और रजिस्टर_ग्लोबल्स निर्देश को अक्षम करने से जुड़ी समस्याओं के बारे में प्रश्न उठते हैं, हम इस लेख में इस विषय को थोड़ा कवर करने का प्रयास करेंगे।

सबसे पहले, आइए परिभाषित करें कि बाहरी चर क्या हैं। ये कोई भी वेरिएबल हैं जो प्रोग्राम में बाहर से आते हैं, यानी। प्रोग्राम में ही परिभाषित नहीं हैं. एक PHP स्क्रिप्ट के लिए, ब्राउज़र लाइन या फॉर्म के माध्यम से पारित होने वाले सभी वेरिएबल बाहरी होते हैं।
आइए देखें कि वे कैसे बनाए जाते हैं।

यदि रजिस्टर_ग्लोबल्स = ऑन निर्देश सर्वर पर (php.ini में) सक्षम है, तो किसी फॉर्म के माध्यम से या ब्राउज़र लाइन के माध्यम से वेरिएबल पास करते समय, स्क्रिप्ट में जिसके लिए ये वेरिएबल अभिप्रेत हैं, वे स्वचालित रूप से बनाए जाएंगे। वे। यदि आपके ब्राउज़र लाइन में निम्नलिखित लिखा है: www.server.ru/index.php?var=1, तो 1 के बराबर मान वाला $var वैरिएबल स्वचालित रूप से Index.php स्क्रिप्ट में बनाया जाएगा।

टिप्पणी

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

वर्तमान में, अधिकांश होस्ट प्रदाताओं के पास यह निर्देश सक्षम है और आने वाले लंबे समय तक सक्षम रहने की संभावना है, अन्यथा यह कोड निरंतरता को तोड़ सकता है।

जब रजिस्टर_ग्लोबल्स निर्देश अक्षम हो जाता है, तो ऐसे चर तक पहुंच दो तरीकों से संभव है:

  • सहयोगी सरणियों के माध्यम से HTTP_***_VARS (HTTP_POST_VARS, आदि)
  • सुपरग्लोबल सरणियों के माध्यम से ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES, आदि)

सुपरग्लोबल ऐरे किसी भी दायरे में उपलब्ध हैं। PHP डेवलपर्स सर्वर पर रजिस्टर_ग्लोबल्स निर्देश को अक्षम करने और सुपरग्लोबल एरेज़ के माध्यम से वेरिएबल्स के साथ काम करने की सलाह देते हैं। यह अनुशंसा सुरक्षा समस्याओं के कारण है जो रजिस्टर_ग्लोबल्स निर्देश सक्षम होने पर उत्पन्न हो सकती हैं।

हालाँकि हाल तक, होस्टिंग साइटों पर रजिस्टर_ग्लोबल्स निर्देश सक्षम रहा। स्थिति PHP 5 की रिलीज़ के साथ बदलनी शुरू हुई, जहां यह निर्देश डिफ़ॉल्ट रूप से अक्षम है और होस्टर्स इसे सक्षम करने की जल्दी में नहीं हैं (शायद सही भी है)।

तो, वेरिएबल प्राप्त करने के लिए आपको वास्तव में क्या करना चाहिए? आपको उन्हें सुपरग्लोबल एरेज़ से लेने की आवश्यकता है। उदाहरण के लिए, ब्राउज़र लाइन से वेरिएबल पास कराने के लिए, $_GET सरणी का उपयोग करें। मान लीजिए कि ब्राउज़र लाइन www.server.ru/index.php?var=1 कहती है। फिर Index.php में var वेरिएबल प्राप्त करने के लिए आपको लिखना होगा:

$var=$_GET["var"];

और, उदाहरण के लिए, POST विधि का उपयोग करके किसी फॉर्म से स्थानांतरित किए गए वेरिएबल प्राप्त करने के लिए, फॉर्म हैंडलर स्क्रिप्ट में आपको लिखना होगा:

$var=$_POST["var"];

इस लेख में, आप सीखेंगे कि HTML, JavaScript, PHP और MySql का उपयोग करके पंजीकरण और लॉगिन फॉर्म कैसे बनाएं। ऐसे फॉर्म लगभग हर वेबसाइट पर उपयोग किए जाते हैं, चाहे उसका प्रकार कुछ भी हो। वे एक फ़ोरम, एक ऑनलाइन स्टोर, सोशल नेटवर्क (जैसे फेसबुक, ट्विटर, ओडनोक्लास्निकी) और कई अन्य प्रकार की साइटों के लिए बनाए गए हैं।

यदि आपके पास अपने स्थानीय कंप्यूटर पर एक वेबसाइट है, तो मुझे आशा है कि आपके पास पहले से ही एक स्थानीय सर्वर स्थापित और चल रहा है। इसके बिना कोई काम नहीं चलेगा.

डेटाबेस में एक टेबल बनाना

उपयोगकर्ता पंजीकरण को लागू करने के लिए सबसे पहले हमें एक डेटाबेस की आवश्यकता है। यदि आपके पास यह पहले से ही है, तो बढ़िया है, अन्यथा, आपको इसे बनाने की आवश्यकता है। लेख में, मैं विस्तार से बताता हूं कि यह कैसे करना है।

और इसलिए, हमारे पास एक डेटाबेस है (संक्षिप्त रूप में डीबी), अब हमें एक तालिका बनाने की आवश्यकता है उपयोगकर्ताओंजिसमें हम अपने पंजीकृत उपयोगकर्ताओं को जोड़ेंगे।

मैंने लेख में डेटाबेस में टेबल बनाने का तरीका भी बताया है। तालिका बनाने से पहले, हमें यह निर्धारित करना होगा कि इसमें कौन से फ़ील्ड होंगे। ये फ़ील्ड पंजीकरण फॉर्म के फ़ील्ड के अनुरूप होंगे।

इसलिए, हमने सोचा, कल्पना की कि हमारे फॉर्म में कौन से फ़ील्ड होंगे और एक तालिका बनाई जाएगी उपयोगकर्ताओंइन क्षेत्रों के साथ:

  • पहचान- पहचानकर्ता. मैदान पहचानडेटाबेस की प्रत्येक तालिका में यह होना चाहिए।
  • पहला नाम- नाम बचाने के लिए.
  • उपनाम- उपनाम को सुरक्षित रखने के लिए.
  • ईमेल- डाक पता सहेजने के लिए. हम ई-मेल को लॉगिन के रूप में उपयोग करेंगे, इसलिए यह फ़ील्ड अद्वितीय होनी चाहिए, यानी अद्वितीय अनुक्रमणिका होनी चाहिए।
  • ईमेल_स्थिति- फ़ील्ड यह इंगित करने के लिए कि मेल की पुष्टि हुई है या नहीं। यदि मेल कन्फर्म है तो उसका मान 1 होगा, अन्यथा मान 0 होगा।
  • पासवर्ड- पासवर्ड सेव करने के लिए.


यदि आप चाहते हैं कि आपके पंजीकरण फॉर्म में कुछ अन्य फ़ील्ड हों, तो आप उन्हें भी यहां जोड़ सकते हैं।

बस, हमारी मेज उपयोगकर्ताओंतैयार। चलिए अगले चरण पर चलते हैं।

डेटाबेस कनेक्शन

हमने डेटाबेस बना लिया है, अब हमें उससे जुड़ना है। हम PHP एक्सटेंशन MySQLi का उपयोग करके कनेक्ट करेंगे।

हमारी साइट के फ़ोल्डर में, नाम के साथ एक फ़ाइल बनाएं dbconnect.php, और इसमें निम्नलिखित स्क्रिप्ट लिखें:

यह फ़ाइल dbconnect.phpप्रपत्र हैंडलर से कनेक्ट करने की आवश्यकता होगी.

चर पर ध्यान दें $पता_साइट, यहां मैंने अपनी परीक्षण साइट का नाम दर्शाया है जिस पर मैं काम करूंगा। कृपया तदनुसार अपनी साइट का नाम बताएं।

साइट संरचना

अब आइए हमारी साइट की HTML संरचना पर नजर डालें।

हम साइट के हेडर और फ़ूटर को अलग-अलग फ़ाइलों में ले जायेंगे, हेडर.phpऔर footer.php. हम उन्हें सभी पेजों पर शामिल करेंगे. अर्थात् मुख्य पृष्ठ पर (फ़ाइल Index.php), पंजीकरण फॉर्म वाले पृष्ठ पर (फ़ाइल form_register.php) और प्राधिकरण प्रपत्र वाले पृष्ठ पर (फ़ाइल form_auth.php).

हमारे लिंक से ब्लॉक करें, पंजीकरणऔर प्राधिकार, उन्हें साइट हेडर में जोड़ें ताकि वे सभी पृष्ठों पर प्रदर्शित हों। एक लिंक पंजीकरण फॉर्म (फ़ाइल) वाले पृष्ठ पर प्रवेश करेगा form_register.php) और दूसरा प्राधिकरण प्रपत्र वाले पृष्ठ पर (फ़ाइल)। form_auth.php).

हेडर.php फ़ाइल की सामग्री:

हमारी साइट का नाम

परिणामस्वरूप, हमारा मुख्य पृष्ठ इस प्रकार दिखता है:


बेशक, आपकी साइट की संरचना बिल्कुल अलग हो सकती है, लेकिन यह अब हमारे लिए महत्वपूर्ण नहीं है। मुख्य बात यह है कि पंजीकरण और प्राधिकरण के लिए लिंक (बटन) हैं।

अब पंजीकरण फॉर्म पर चलते हैं। जैसा कि आप पहले ही समझ चुके हैं, हमारे पास यह फ़ाइल में है form_register.php.

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

सर्वर पर, पंजीकरण फॉर्म को संसाधित करने के परिणामस्वरूप, विभिन्न त्रुटियां हो सकती हैं जिसके कारण उपयोगकर्ता पंजीकरण नहीं कर पाएगा। इसलिए, उपयोगकर्ता को यह समझने के लिए कि पंजीकरण विफल क्यों होता है, इन त्रुटियों के बारे में संदेश प्रदर्शित करना आवश्यक है।

प्रपत्र प्रदर्शित करने से पहले, सत्र से त्रुटि संदेश प्रदर्शित करने के लिए एक ब्लॉक जोड़ें।

और एक बात, यदि उपयोगकर्ता पहले से ही अधिकृत है, और जिज्ञासावश वह ब्राउज़र के एड्रेस बार में लिखकर सीधे पंजीकरण पृष्ठ पर जाता है साइट_एड्रेस/फॉर्म_रजिस्टर.php, तो इस मामले में, पंजीकरण फॉर्म के बजाय, हम यह बताते हुए एक हेडर प्रदर्शित करेंगे कि वह पहले से ही पंजीकृत है।

सामान्य तौर पर, फ़ाइल कोड form_register.phpवी गॉट दिस:

आप पहले से ही पंजीकृत हैं

ब्राउज़र में, पंजीकरण फॉर्म वाला पृष्ठ इस तरह दिखता है:


आवश्यक विशेषता का उपयोग करके, हमने सभी फ़ील्ड को अनिवार्य बना दिया है।

पंजीकरण फॉर्म के कोड पर ध्यान दें जहां कैप्चा प्रदर्शित होता है:


हमने छवि के लिए src विशेषता के मान में फ़ाइल का पथ निर्दिष्ट किया है कैप्चा.php, जो इस कैप्चा को उत्पन्न करता है।

आइए फ़ाइल कोड को देखें कैप्चा.php:

कोड पर अच्छी तरह से टिप्पणी की गई है, इसलिए मैं सिर्फ एक बिंदु पर ध्यान केंद्रित करूंगा।

किसी फ़ंक्शन के अंदर छविTtfText(), फ़ॉन्ट का पथ निर्दिष्ट है verdana.ttf. इसलिए कैप्चा के सही ढंग से काम करने के लिए, हमें एक फ़ोल्डर बनाना होगा फोंट्स, और फ़ॉन्ट फ़ाइल को वहां रखें verdana.ttf. आप इसे पा सकते हैं और इंटरनेट से डाउनलोड कर सकते हैं, या इस लेख की सामग्री के साथ संग्रह से ले सकते हैं।

हमने HTML संरचना पूरी कर ली है, अब आगे बढ़ने का समय आ गया है।

JQuery का उपयोग करके ईमेल वैधता की जाँच करना

किसी भी फॉर्म को क्लाइंट साइड (जावास्क्रिप्ट, jQuery का उपयोग करके) और सर्वर साइड दोनों पर दर्ज किए गए डेटा की वैधता की जांच करने की आवश्यकता है।

हमें ईमेल क्षेत्र पर विशेष ध्यान देना चाहिए। यह बहुत महत्वपूर्ण है कि दर्ज किया गया डाक पता वैध हो।

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


और इस मामले में, हमें अधिक विश्वसनीय जांच करनी चाहिए। ऐसा करने के लिए, हम जावास्क्रिप्ट से jQuery लाइब्रेरी का उपयोग करेंगे।

फ़ाइल में jQuery लाइब्रेरी को कनेक्ट करने के लिए हेडर.phpटैग के बीच , समापन टैग से पहले , यह पंक्ति जोड़ें:

इस लाइन के तुरंत बाद, हम ईमेल सत्यापन कोड जोड़ देंगे। यहां हम दर्ज किए गए पासवर्ड की लंबाई जांचने के लिए एक कोड जोड़ेंगे। इसकी लंबाई कम से कम 6 अक्षर होनी चाहिए।

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

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

उपयोगकर्ता पंजीकरण

हम प्रोसेसिंग के लिए फॉर्म को फाइल में भेजते हैं रजिस्टर.php, POST विधि के माध्यम से। इस हैंडलर फ़ाइल का नाम विशेषता मान में निर्दिष्ट है कार्रवाई. और भेजने की विधि विशेषता मान में निर्दिष्ट है तरीका.

इस फ़ाइल को खोलें रजिस्टर.phpऔर पहली चीज़ जो हमें करने की ज़रूरत है वह है एक सत्र लॉन्च फ़ंक्शन लिखना और उस फ़ाइल को कनेक्ट करना जो हमने पहले बनाई थी dbconnect.php(इस फ़ाइल में हमने डेटाबेस से कनेक्शन बनाया है)। और साथ ही, आइए तुरंत कोशिकाओं की घोषणा करें त्रुटि संदेशऔर सफलता_संदेशवैश्विक सत्र सरणी में। में त्रुटि_संदेशहम फॉर्म प्रोसेसिंग के दौरान होने वाले सभी त्रुटि संदेशों को रिकॉर्ड करेंगे सफलता_संदेश, हम खुशी भरे संदेश रिकॉर्ड करेंगे।

आगे बढ़ने से पहले, हमें यह जांचना होगा कि फॉर्म सबमिट किया गया था या नहीं। एक हमलावर विशेषता मान को देख सकता है कार्रवाईफ़ॉर्म से, और पता लगाएं कि कौन सी फ़ाइल इस फ़ॉर्म को संसाधित कर रही है। और उसे ब्राउज़र के एड्रेस बार में निम्नलिखित पता टाइप करके सीधे इस फ़ाइल पर जाने का विचार हो सकता है: http://site_address/register.php

इसलिए हमें वैश्विक POST सरणी में एक सेल की जांच करने की आवश्यकता है जिसका नाम फॉर्म से हमारे "रजिस्टर" बटन के नाम से मेल खाता है। इस तरह हम जांचते हैं कि "रजिस्टर" बटन पर क्लिक किया गया था या नहीं।

यदि कोई हमलावर सीधे इस फ़ाइल पर जाने का प्रयास करता है, तो उन्हें एक त्रुटि संदेश प्राप्त होगा। मैं आपको याद दिला दूं कि $address_site वैरिएबल में साइट का नाम होता है और इसे फ़ाइल में घोषित किया गया था dbconnect.php.

सत्र में कैप्चा मान फ़ाइल में जेनरेट होने पर जोड़ा गया था कैप्चा.php. एक अनुस्मारक के रूप में, मैं आपको फ़ाइल से कोड का यह टुकड़ा फिर से दिखाऊंगा कैप्चा.php, जहां कैप्चा मान सत्र में जोड़ा जाता है:

अब आइए सत्यापन के लिए ही आगे बढ़ें। फाइल मैं रजिस्टर.php, if ब्लॉक के अंदर, जहां हम जांचते हैं कि क्या "रजिस्टर" बटन पर क्लिक किया गया था, या यूं कहें कि जहां टिप्पणी " इंगित की गई है" // (1) कोड के अगले भाग के लिए स्थान"हम लिखते हैं:

//प्राप्त कैप्चा की जांच करें // पंक्ति के आरंभ और अंत से रिक्त स्थान को ट्रिम करें $कैप्चा = ट्रिम($_POST["कैप्चा"]); if(isset($_POST["captcha"]) && !empty($captcha))( //प्राप्त मूल्य की तुलना सत्र के मूल्य से करें। if(($_SESSION["rand"] != $captcha) && ($_SESSION ["रैंड"] != ""))( // यदि कैप्चा सही नहीं है, तो हम उपयोगकर्ता को पंजीकरण पृष्ठ पर लौटाते हैं, और वहां हम उसे एक त्रुटि संदेश दिखाएंगे कि उसने गलत कैप्चा दर्ज किया है $error_message = "

गलती! आपने गलत कैप्चा दर्ज किया है

"; // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] = $error_message; // उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से स्थानांतरित"); हेडर("स्थान: " .$address_site ।"/form_register.php"); //स्क्रिप्ट निकास रोकें(); ) // (2) कोड के अगले भाग के लिए स्थान)अन्यथा( //यदि कैप्चा पारित नहीं हुआ है या यह खाली निकास है ("

गलती! इसमें कोई वेरिफिकेशन कोड यानी कैप्चा कोड नहीं है. आप मुख्य पृष्ठ पर जा सकते हैं.

"); }

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

यदि सेल मौजूद है, तो हम इस सेल से लाइन के आरंभ और अंत से रिक्त स्थान को ट्रिम करते हैं, अन्यथा, हम उपयोगकर्ता को पंजीकरण फॉर्म वाले पृष्ठ पर वापस रीडायरेक्ट करते हैं।

इसके बाद, रिक्त स्थान को ट्रिम करने के बाद, हम वेरिएबल में लाइन जोड़ते हैं और इस वेरिएबल को रिक्तता के लिए जांचते हैं; यदि यह खाली नहीं है, तो हम आगे बढ़ते हैं, अन्यथा हम उपयोगकर्ता को पंजीकरण फॉर्म के साथ पृष्ठ पर वापस रीडायरेक्ट करते हैं।

इस कोड को निर्दिष्ट स्थान पर चिपकाएँ" // (2) कोड के अगले भाग के लिए स्थान".

/* जांचें कि वैश्विक सरणी $_POST में फॉर्म से डेटा भेजा गया है या नहीं और सबमिट किए गए डेटा को नियमित चर में लपेटें।*/ if(isset($_POST["first_name"]))( //शुरुआत से रिक्त स्थान ट्रिम करें और स्ट्रिंग का अंत $first_name = ट्रिम($_POST["first_name"]); // रिक्तता के लिए चर की जांच करें यदि(!empty($first_name))( // सुरक्षा के लिए, विशेष वर्णों को HTML इकाइयों में परिवर्तित करें $first_name = htmlspecialchars($first_name, ENT_QUOTES); )else( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

अपना नाम दर्ज करें

नाम फ़ील्ड गुम है

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site।"/form_register.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) if( isset($_POST["last_name"]))( //पंक्ति के आरंभ और अंत से रिक्त स्थान ट्रिम करें $last_name = ट्रिम($_POST["last_name"]); if(!empty($last_name)) (// सुरक्षा के लिए, विशेष वर्णों को HTML इकाइयों में परिवर्तित करें $last_name = htmlspecialchars($last_name, ENT_QUOTES); )अन्यथा( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

कृपया अपना अंतिम नाम दर्ज करें

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site।"/form_register.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) )अन्यथा ( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

अंतिम नाम फ़ील्ड गायब है

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site।"/form_register.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) if( isset($_POST["email"]))( //पंक्ति के आरंभ और अंत से रिक्त स्थान ट्रिम करें $email = ट्रिम($_POST["email"]); if(!empty($email)) ($ ईमेल = htmlspecialchars ($ ईमेल, ENT_QUOTES); // (3) ईमेल पते के प्रारूप और इसकी विशिष्टता की जांच के लिए कोड स्थान) अन्यथा ( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

अपना ईमेल दर्ज करें

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site।"/form_register.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) )अन्यथा ( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site।"/form_register.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) if( isset($_POST["password"]))( //स्ट्रिंग के आरंभ और अंत से रिक्त स्थान ट्रिम करें $password = ट्रिम($_POST["password"]); if(!empty($password)) ($password = htmlspecialchars ($password, ENT_QUOTES); // पासवर्ड एन्क्रिप्ट करें $password = md5($password."top_secret"); )else( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

अपना कूटशब्द भरें

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site।"/form_register.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) )अन्यथा ( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site।"/form_register.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) // (4) डेटाबेस में उपयोगकर्ता को जोड़ने के लिए कोड का स्थान

क्षेत्र का विशेष महत्व है ईमेल. हमें प्राप्त डाक पते के प्रारूप और डेटाबेस में इसकी विशिष्टता की जांच करनी चाहिए। अर्थात्, क्या उसी ईमेल पते वाला कोई उपयोगकर्ता पहले से पंजीकृत है?

निर्दिष्ट स्थान पर" // (3) डाक पते के प्रारूप और उसकी विशिष्टता की जांच करने के लिए कोड स्थान"निम्नलिखित कोड जोड़ें:

//नियमित अभिव्यक्ति $reg_email = "/^**@(+(*+)*\.)++/i" का उपयोग करके प्राप्त ईमेल पते के प्रारूप की जांच करें; //यदि प्राप्त ईमेल पते का प्रारूप नियमित अभिव्यक्ति से मेल नहीं खाता है if(!preg_match($reg_email, $email))( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

आपने ग़लत ईमेल दर्ज किया है

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site।"/form_register.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) // हम जांचते हैं कि क्या ऐसा पता पहले से ही डेटाबेस में है। $result_query = $mysqli->query('SELECT `email` FROM `users` WHERE `email`=''.$email.''''); / /यदि प्राप्त संख्या में बिल्कुल एक पंक्ति है, जिसका अर्थ है कि इस ईमेल पते वाला उपयोगकर्ता पहले से ही पंजीकृत है यदि($result_query->num_rows == 1)( //यदि परिणामी परिणाम गलत नहीं है यदि(($पंक्ति = $result_query->fetch_assoc()) != false) ( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

इस ईमेल पते वाला एक उपयोगकर्ता पहले से ही पंजीकृत है

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site."/form_register.php"); )अन्यथा(//त्रुटि संदेश सहेजें सत्र के लिए . $_SESSION["error_messages"] .= "

डेटाबेस क्वेरी में त्रुटि

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site."/form_register.php"); ) /* चयन बंद करना */ $ परिणाम_क्वेरी-> बंद करें(); //स्क्रिप्ट बंद करें निकास(); ) /* चयन बंद करना */ $result_query->बंद करें();

और इसलिए, हमने सभी जांच पूरी कर ली है, अब उपयोगकर्ता को डेटाबेस में जोड़ने का समय आ गया है। निर्दिष्ट स्थान पर" // (4) डेटाबेस में उपयोगकर्ता को जोड़ने के लिए कोड का स्थान"निम्नलिखित कोड जोड़ें:

//डेटाबेस में उपयोगकर्ता को जोड़ने के लिए क्वेरी $result_query_insert = $mysqli->query('INSERT INTO `users` (first_name, Last_name, email,password) VALUES (""।$first_name."", ""।$last_name ।" ", ""।$ईमेल।", ""।$पासवर्ड।"")"); if(!$result_query_insert)( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

उपयोगकर्ता को डेटाबेस में जोड़ने के अनुरोध में त्रुटि

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site।"/form_register.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); )अन्यथा( $_SESSION["success_messages"] = "

पंजीकरण सफलतापूर्वक पूरा हुआ!!!
अब आप अपने यूजरनेम और पासवर्ड का उपयोग करके लॉग इन कर सकते हैं।

"; //उपयोगकर्ता को प्राधिकरण पृष्ठ हेडर पर भेजें("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site."/form_auth.php"); ) /* अनुरोध पूरा करना */ $ परिणाम_क्वेरी_इन्सर्ट-> बंद करें(); //डेटाबेस से कनेक्शन बंद करें $mysqli->बंद करें();

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

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

ईमेल पता प्रारूप और पासवर्ड की लंबाई की जाँच करने की स्क्रिप्ट फ़ाइल में है हेडर.php, इसलिए यह इस फॉर्म के फ़ील्ड पर भी लागू होगा।

फ़ाइल में सत्र भी प्रारंभ हो गया है हेडर.php, तो फ़ाइल में form_auth.phpसत्र शुरू करने की कोई आवश्यकता नहीं है, क्योंकि हमें एक त्रुटि मिलेगी।


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

त्रुटियों को ठीक करने के बाद बटन आने के लिएसक्रिय हो जाता है, और उपयोगकर्ता सर्वर पर फॉर्म जमा करने में सक्षम होगा, जहां इसे संसाधित किया जाएगा।

उपयोगकर्ता प्राधिकरण

मूल्य विशेषता के लिए कार्रवाईप्राधिकरण बाधा में एक फ़ाइल निर्दिष्ट है auth.php, इसका मतलब है कि फॉर्म इस फ़ाइल में संसाधित किया जाएगा।

और इसलिए, फ़ाइल खोलें auth.phpऔर प्राधिकरण प्रपत्र को संसाधित करने के लिए कोड लिखें। पहली चीज़ जो आपको करने की ज़रूरत है वह एक सत्र शुरू करना और फ़ाइल को कनेक्ट करना है dbconnect.phpडेटाबेस से जुड़ने के लिए.

जब आप साइट से बाहर निकलने के लिंक पर क्लिक करते हैं, तो हमें एक फ़ाइल पर ले जाया जाता है लॉगआउट.php, जहां हम सत्र से ईमेल पते और पासवर्ड के साथ कोशिकाओं को नष्ट कर देते हैं। इसके बाद, हम उपयोगकर्ता को उस पृष्ठ पर वापस लौटाते हैं जिस पर लिंक पर क्लिक किया गया था बाहर निकलना.

फ़ाइल कोड लॉगआउट.php:

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

हमने यह भी सीखा कि इनपुट डेटा को क्लाइंट साइड (ब्राउज़र में, जावास्क्रिप्ट, jQuery का उपयोग करके) और सर्वर साइड (PHP का उपयोग करके) दोनों पर कैसे मान्य किया जाए। हमने यह भी सीखा कि साइट छोड़ने की प्रक्रिया को कैसे लागू किया जाए।

सभी स्क्रिप्ट का परीक्षण किया जा चुका है और वे काम कर रही हैं। आप इस लिंक से इस छोटी साइट की फ़ाइलों के साथ संग्रह डाउनलोड कर सकते हैं।

भविष्य में मैं एक लेख लिखूंगा जहां मैं वर्णन करूंगा। और मैं एक लेख लिखने की भी योजना बना रहा हूं जहां मैं समझाऊंगा (पेज को दोबारा लोड किए बिना)। इसलिए, नए लेखों के जारी होने के बारे में सूचित रहने के लिए, आप मेरी वेबसाइट की सदस्यता ले सकते हैं।

यदि आपके कोई प्रश्न हैं, तो कृपया मुझसे संपर्क करें, और यदि आपको लेख में कोई त्रुटि दिखाई देती है, तो कृपया मुझे बताएं।

पाठ योजना (भाग 5):

  • प्राधिकरण प्रपत्र के लिए एक HTML संरचना बनाना
  • हम प्राप्त डेटा को संसाधित करते हैं
  • हम साइट हेडर में उपयोगकर्ता का अभिवादन प्रदर्शित करते हैं
  • क्या आपको लेख पसंद आया?

    मुझे नहीं पता क्यों... नहीं, मुझे पता है कि आप रजिस्टर_ग्लोबल्स निर्देश को सक्षम क्यों नहीं कर सकते, लेकिन मुझे नहीं पता कि साहित्य में, एक नियम के रूप में, इसके बारे में कुछ क्यों नहीं कहा गया है।

    इस लेख में मैं उसमें बैठे सभी लोगों को टैंक से बाहर निकालने की कोशिश करूंगा और समझाऊंगा कि क्या है (विशेषकर बख्तरबंद ट्रेन में बैठे लोगों के लिए - संपादक का नोट)। यह अकारण नहीं है कि कुछ होस्टर्स इस निर्देश को अक्षम कर देते हैं। इसलिए…

    यह काम किस प्रकार करता है

    PHP सेटिंग्स (php.ini फ़ाइल) में ऐसा एक रजिस्टर_ग्लोबल्स निर्देश है। इसका अर्थ यह है कि यदि इसे सक्षम किया गया है (register_globals = on), तो GET और POST के माध्यम से पारित सभी चर स्वचालित रूप से वैश्विक के रूप में पंजीकृत हो जाएंगे। इसका मतलब क्या है?

    उदाहरण के लिए, हम GET विधि को कुछ पेज वैल्यू के लिए Index.php स्क्रिप्ट में पास करते हैं: Index.php?page=2। पारित मान को GET सरणी में संग्रहीत किया जाता है और इसे स्क्रिप्ट में $_GET["पेज"] के रूप में उपयोग किया जा सकता है। हालाँकि, यदि हमारे पास रजिस्टर_ग्लोबल्स सक्षम है, तो पारित मूल्य के लिए एक $ पेज वैरिएबल बनाया जाएगा, जो कि Index.php स्क्रिप्ट के किसी भी हिस्से में उपलब्ध है।

    एक छोटा सा सारांश और अतिरिक्त. जब रजिस्टर_ग्लोबल्स सक्षम किया जाता है, तो वेरिएबल की तीन प्रतियां बनाई जाती हैं: GET सरणी में, GLOBALS सरणी में, और केवल वेरिएबल ही ($_GET["पेज"], $GLOBALS["पेज"], $पेज), जबकि जब रजिस्टर_ग्लोबल्स अक्षम हो जाता है, तो पारित मूल्य केवल GET सरणी ($_GET["पेज"]) के माध्यम से पहुंच योग्य हो सकता है। याद करना।

    उपयोग का खतरा

    आइए यह समझने के लिए एक सरल उदाहरण देखें कि हमारे लिए क्या भविष्य है (3 से 5 वर्ष तक - संपादक का नोट). इसे आसान बनाने के लिए, मैं तुरंत कहूंगा कि $लॉगिन और $पासवर्ड GET/POST विधि द्वारा पारित किए गए वेरिएबल हैं।

    स्क्रिप्ट क्या करती है इसके बारे में संक्षेप में:

      पंक्ति 2. हम उपयोगकर्ता द्वारा दर्ज किए गए लॉगिन के लिए वास्तविक पासवर्ड निकालने के लिए डेटाबेस से अनुरोध करते हैं।

      पंक्ति 3. हम यह पासवर्ड प्राप्त करते हैं और इसे $real_pass वेरिएबल को निर्दिष्ट करते हैं।

      पंक्ति 4. हम वास्तविक और दर्ज किए गए पासवर्ड की तुलना करते हैं और यदि वे मेल खाते हैं, तो $चेक वेरिएबल को सत्य असाइन किया जाएगा।

      पंक्तियाँ 5-8. यदि $check सत्य है, तो हम लिखते हैं कि प्राधिकरण सफल रहा, आदि।

    प्रस्तावित परिदृश्य, परिभाषा के अनुसार, दुनिया में सबसे अधिक लीक वाला है, और अब मैं आपको ये छेद दिखाऊंगा। शर्त: रजिस्टर_ग्लोबल्स सक्षम है।

    मान लीजिए कि स्थानांतरण GET विधि का उपयोग करके किया जाता है। फिर यूआरएल कुछ इस तरह दिखेगा:
    www.site.com/index.php?login =admin&password =qwerty
    यह स्पष्ट है कि वैश्विक वैरिएबल $लॉगिन और $पासवर्ड तुरंत बनाए जाते हैं। अब स्क्रिप्ट देखिए. इसमें $चेक वैरिएबल शामिल है। यदि आप इसे यूआरएल के माध्यम से पास करते हैं तो क्या होगा?

    www.site.com/index.php?login =admin&password =qwerty&check =1
    फिर पासवर्ड मिलान जांच को दरकिनार कर दिया जाता है और उपयोगकर्ता को तुरंत अधिकृत कर दिया जाता है (आखिरकार, क्या आपको याद है कि 1 सत्य है, और 0 गलत है?)। यदि हम लिखेंगे तो भी यही परिणाम होगा www.साइट।com/अनुक्रमणिका।php?जाँच करना =1 . और यदि आप POST विधि का उपयोग करते हैं, तब भी ऐसी सभी धोखाधड़ी काम करेंगी, क्योंकि जब रजिस्टर_ग्लोबल्स सक्षम होता है, तो इससे कोई फर्क नहीं पड़ता कि आप किस विधि का उपयोग करते हैं - GET या POST।

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

    हालाँकि, सभी होस्टर्स रजिस्टर_ग्लोबल्स को अक्षम नहीं करते हैं, और भले ही आपकी स्क्रिप्ट रजिस्टर_ग्लोबल्स को सक्षम न करने के लिए डिज़ाइन की गई हो, फिर भी एक क्रैकर इस निर्देश की भेद्यता का उपयोग करके आपकी स्क्रिप्ट को हैक कर सकता है।

    आइए अपना उदाहरण लें. यदि लाइन के बाद रजिस्टर_ग्लोबल्स सक्षम है तो इसे सुरक्षित रखने के लिए अगर ($पासवर्ड==$असली_पास) $जांचें =सत्य;निम्नलिखित जोड़ें: अन्यथा$जांचें =असत्य;. इस मामले में, भले ही एक के बराबर चेक वेरिएबल GET विधि द्वारा पारित किया गया हो, फिर भी पासवर्ड गलत होने पर स्क्रिप्ट $check=false सेट करेगी।

    हां, मैं आपका ध्यान इस तथ्य की ओर भी आकर्षित करना चाहूंगा कि यदि आप रजिस्टर_ग्लोबल्स को बंद कर देते हैं, तो हमारा उदाहरण काम नहीं करेगा। और इसे काम करने के लिए, आपको $login = $_POST["login"]; लिखना होगा। $पासवर्ड = $_POST["पासवर्ड"];

    आइये इसे संक्षेप में कहें...

    और दो मुख्य निष्कर्ष निकालें:

    1) जब रजिस्टर_ग्लोबल्स सक्षम होता है, तो आप विभिन्न वेरिएबल्स को पास कर सकते हैं, जिनके मानों की गणना GET या POST के माध्यम से प्राप्त करने के लिए नहीं की गई थी।

    2) रजिस्टर_ग्लोबल्स अपने आप में इतनी खतरनाक नहीं है जितनी टेढ़ी-मेढ़ी लिखी स्क्रिप्ट।

    यह सभी आज के लिए है! मुझे आपकी टिप्पणियाँ, टिप्पणियाँ, सुझाव और सिर्फ प्रतिक्रिया देखकर बहुत खुशी होगी। इसलिए, लिखो, शरमाओ मत!

    सफल सप्ताह की शुभकामनाओं के साथ,
    अलेक्जेंडर शुयस्की