PHP और MySQL में एक सरल उपयोगकर्ता पंजीकरण प्रणाली बनाना। रजिस्टर_ग्लोबल्स=ओएन? आप ख़तरे में हैं! अवैयक्तिक सूचकांक php रजिस्टर

💖क्या आपको यह पसंद है?लिंक को अपने दोस्तों के साथ साझा करें

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

ज्यादातर मामलों में, अधिक सरलीकृत पंजीकरण प्रणाली का उपयोग किया जाता है, जो एक फ़ाइल में php में लिखी जाती है रजिस्टर.php.

तो, हम थोड़ा पीछे हट गए हैं, और अब हम पंजीकरण फ़ाइल पर करीब से नज़र डालेंगे।

रजिस्टर.php फ़ाइल

यह सुनिश्चित करने के लिए कि इसमें आपका बहुत अधिक समय न लगे, हम एक ऐसी प्रणाली बनाएंगे जो उपयोगकर्ताओं से न्यूनतम संपर्क जानकारी स्वीकार करते हुए एकत्र करेगी। इस मामले में, हम सब कुछ MySQL डेटाबेस में दर्ज करेंगे। डेटाबेस की उच्चतम गति के लिए, हम MyISAM प्रारूप में और utf-8 एन्कोडिंग में उपयोगकर्ता तालिका बनाएंगे।

टिप्पणी! सभी स्क्रिप्ट हमेशा एक ही एन्कोडिंग में लिखी जानी चाहिए। सभी साइट फ़ाइलें और MySql डेटाबेस समान एन्कोडिंग में होने चाहिए। सबसे आम एन्कोडिंग UTF-8 और Windows-1251 हैं।

आपको सब कुछ एक एन्कोडिंग में लिखने की आवश्यकता क्यों है, हम इस बारे में बाद में बात करेंगे। अभी के लिए, इस जानकारी को स्क्रिप्ट बनाने के लिए एक सख्त नियम के रूप में लें, अन्यथा आपको भविष्य में स्क्रिप्ट के साथ समस्या होगी। निःसंदेह, यह ठीक है, लेकिन आप स्क्रिप्ट में त्रुटियों को खोजने में बहुत समय बर्बाद करेंगे।

स्क्रिप्ट स्वयं कैसे काम करेगी?

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

यहाँ स्क्रिप्ट ही है. सब कुछ एक फ़ाइल में दर्ज है रजिस्टर.php:

! `; // लाल प्रश्न चिह्न $sha=$sh."scripts/pro/"; //मुख्य फ़ोल्डर का पथ $bg=` bgcolor='#E1FFEB'`; // पंक्तियों का पृष्ठभूमि रंग?> उदाहरण पंजीकरण स्क्रिप्ट रजिस्टर.php style.css" />

इस मामले में, स्क्रिप्ट स्वयं को संदर्भित करती है। और यह फॉर्म में दर्ज किए गए डेटा का एक फॉर्म और प्रोसेसर है। कृपया ध्यान दें कि फ़ाइल एक ज़िप संग्रह के रूप में संपीड़ित है और इसमें एक कॉन्फ़िगरेशन फ़ाइल config.php, एक उपयोगकर्ता डेटाबेस डंप, सहायक फ़ंक्शंस वाली फ़ाइल function.php, एक स्टाइल फ़ाइल style.css और स्वयं रजिस्टर.php फ़ाइल शामिल है। ऐसी कई फ़ाइलें भी हैं जो कैप्चा प्रतीकों के संचालन और निर्माण के लिए ज़िम्मेदार हैं।

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

आपको प्राप्त वेरिएबल को पंजीकृत करने की अनुमति देता है अनुरोध प्राप्त करें. मान लीजिए कि इस तरह का एक अनुरोध था: Index.php?a=15. इस प्रकार, निश्चित रूप से, एक वेरिएबल बनाया जाता है $_GET["ए"]और परिवर्तनशील . यहाँ परिवर्तनशील सृष्टि है और परिणामस्वरूप हुआ सक्षम रजिस्टर_ग्लोबल्स निर्देश.

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

यदि (($_POST["लॉगिन"] == "एडमिन") && ($_POST["पासवर्ड"] == "123456")) $check_user = true;
यदि ($check_user) प्रतिध्वनि "प्राधिकरण सफल रहा";
अन्यथा प्रतिध्वनि "प्राधिकरण त्रुटि";
?>

अब यदि फ़ाइल को कॉल किया जाता है, उदाहरण के लिए, auth.php, फिर इसे इस प्रकार एक्सेस करें: auth.php?check_user=1, तो सफल प्राधिकरण प्राप्त किया जाएगा, भले ही लॉगिन और पासवर्ड क्या भेजा गया था और क्या वे बिल्कुल भी भेजे गए थे।

निःसंदेह, यह उदाहरण थोड़ा रहस्यमय है, क्योंकि कोई भी ऐसा नहीं लिखता (यदि केवल कमी के कारण)। अन्यथा $check_user = गलत;), हालाँकि, यह उदाहरण स्पष्ट रूप से दिखाता है कि क्या हो सकता है सक्षम रजिस्टर_ग्लोबल्स निर्देश.

अब कैसे के बारे में रजिस्टर_ग्लोबल्स निर्देश को अक्षम करें. ऐसा करने के लिए आपको फ़ाइल में जोड़ना होगा .htaccessबस एक पंक्ति:

Php_वैल्यू रजिस्टर_ग्लोबल्स 0

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

13.9K

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

रजिस्टर_ग्लोबल्स क्या है?
यह php.ini में एक विकल्प है, जो POST या GET विधि द्वारा प्राप्त वेरिएबल्स को वैश्विक $GLOBALS सरणी में पंजीकृत करने की आवश्यकता को इंगित करता है।

स्पष्टता के लिए, मैं रजिस्टर_ग्लोबल्स=ऑन के साथ एक उदाहरण दूंगा।
सामग्री के साथ एक फ़ाइल "index.php" है:

"; प्रतिध्वनि $ग्लोबल्स["asd"]।" - वैश्विक सरणी $GLOBALS में लिंक
"; प्रतिध्वनि $_GET["asd"]।" - $_GET["asd"]"; ?>

एड्रेस बार में हम लिखेंगे: Index.php?asd=123

जैसा कि हम देख सकते हैं, 2 वेरिएबल बनाए गए हैं: एक स्थानीय ($GLOBALS में + लिंक), दूसरा $_GET सरणी में। बहुत से लोग $_GET ऐरे का बिल्कुल भी उपयोग नहीं करते हैं, वे "$asd" वेरिएबल को बाहर से प्राप्त करने के बाद उसे प्रोसेस करना जारी रखते हैं।
लेकिन आइए इसके बारे में सोचें, हमें $GLOBALS सरणी को "प्रदूषित" करने की आवश्यकता क्यों है? इसके लिए, हमारे पास विशेष सारणियाँ हैं जो GET ($_GET सारणी) और POST ($_POST सारणी) विधियों द्वारा प्रेषित डेटा को संग्रहीत करती हैं।

वही उदाहरण, लेकिन रजिस्टर_ग्लोबल्स=ऑफ के साथ:

वह। कोई स्थानीय चर नहीं बनाया गया है और हमें "$asd" में हेरफेर करने के लिए $_GET सरणी का उपयोग करना होगा।

आपने रजिस्टर_ग्लोबल्स के बारे में अपना मन पहले ही बदल लिया होगा।
आपको संभवतः अपने कार्यक्रमों में कुछ चीज़ें फिर से लिखनी पड़ेंगी, लेकिन यह इसके लायक है।

और अब मैं आपको बताऊंगा कि एक हमलावर इस विकल्प का उपयोग अपने उद्देश्यों के लिए कैसे कर सकता है, अर्थात। रजिस्टर_ग्लोबल्स=ऑन के साथ
मैं सरल से जटिल की ओर शुरुआत करूँगा।

हम अक्सर चेतावनियाँ देखते हैं:

सूचना: अपरिभाषित चर: asd(परिवर्तनीय नाम) **** में

इसका मतलब क्या है? इसका मतलब यह है कि वेरिएबल "$asd" को स्पष्ट रूप से परिभाषित नहीं किया गया था।
उदाहरण के लिए, कुछ लोग इसमें शामिल होते हैं:

वे। किसी वेरिएबल को परिभाषित किए बिना, वे तुरंत उसका उपयोग करना शुरू कर देते हैं। उपरोक्त कोड सैद्धांतिक रूप से डरावना नहीं है, लेकिन इसके बारे में सोचें, क्या होगा यदि यही वेरिएबल "$asd" बाद में किसी फ़ाइल में लिखा जाए? उदाहरण के लिए, हम एड्रेस बार में निम्नलिखित लिखते हैं: “index.php?asd=LUSER+” और हमें मिलता है: “LUSER 0123456789”। अच्छा, क्या यह देखना अच्छा नहीं होगा? सोचो मत.

मान लीजिए हम एक उपयोगकर्ता प्रमाणीकरण प्रणाली लिख रहे हैं:

मैं एक स्पष्ट रूप से लीक सिस्टम लाया, हमें बस एड्रेस बार में "index.php?valid_user=1" लिखना होगा और हमें "हैलो, यूजर" संदेश मिलेगा।

यदि हम इसे इस प्रकार लिखें तो ऐसा नहीं होगा:

वे। विफलता की स्थिति में उन्होंने स्वयं $valid_user वैरिएबल को FALSE के रूप में परिभाषित किया।

मैं आपको एसक्यूएल इंजेक्शन का एक उदाहरण देता हूं:

एड्रेस बार में हम लिखते हैं: "index.php?where=id=0+UNION+ALL+SELECT+login,+password,+null+FROM+admin+where+login='admin'" हमें एक sql इंजेक्शन मिलता है:

और हैकर को आपके लॉगिन और पासवर्ड मिल जाते हैं :(

जैसा कि आप देख सकते हैं, सभी उदाहरणों में सुरक्षा खामियाँ हैं जिनका फायदा सक्षम रजिस्टर_ग्लोबल्स के माध्यम से उठाया जा सकता है।

यदि आप परिस्थितियों की परवाह किए बिना हमेशा एक चर को परिभाषित करते हैं तो आप इससे निपट सकते हैं। या फ़ंक्शंस में वेरिएबल्स के इनकैप्सुलेशन का उपयोग करें, यानी। जब आप किसी फ़ंक्शन को परिभाषित करते हैं, तो उसके अंदर के वेरिएबल बाहर से निजी होंगे, उदाहरण के लिए:

अब, यदि हम एड्रेस बार में लिखते हैं: “index.php?where=123”
देगा: "$कहाँ मौजूद नहीं है"
लेकिन यह प्रदान किया जाता है कि आप $where वैरिएबल को वैश्विक के रूप में सेट नहीं करते हैं, यानी। "वैश्विक $कहाँ"

मैं और भी कई उदाहरण दे सकता हूं, लेकिन मुझे लगता है कि जो मैंने दिए हैं वे आपके समझने के लिए पर्याप्त होंगे।
मैं कहना चाहता हूं कि जब आप रजिस्टर_ग्लोबल्स = ऑफ विकल्प सेट करते हैं और उपरोक्त सभी उदाहरणों को फिर से आज़माते हैं तो ये सभी समस्याएं गायब हो जाएंगी।

यह php.ini की तरह किया जा सकता है, लेकिन अधिकांश होस्टिंग प्रदाता आपको ऐसा करने की अनुमति नहीं देंगे, इसलिए आपको ".htaccess" फ़ाइल का उपयोग करना होगा

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

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

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

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

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

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

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

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


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

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

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

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

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

डीबी कनेक्शन त्रुटि. त्रुटि विवरण: ".mysqli_connect_error()."

"; बाहर निकलें(); ) // कनेक्शन एन्कोडिंग सेट करें $mysqli->set_charset("utf8"); // सुविधा के लिए, यहां एक वेरिएबल जोड़ें जिसमें हमारी साइट का नाम होगा $address_site = "http://testsite .स्थानीय" ; ?>

यह फ़ाइल 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 . "

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

"); }

इसके बाद, हमें 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); )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"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) 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"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) // हम जाँचते हैं कि क्या ऐसा पता पहले से ही डेटाबेस में है बिल्कुल एक पंक्ति है, जिसका अर्थ है कि इस ईमेल पते वाला उपयोगकर्ता पहले से ही पंजीकृत है if($result_query->num_rows == 1)( //यदि प्राप्त परिणाम गलत नहीं है if(($row = $result_query->fetch_assoc() ) != गलत) ( // त्रुटि संदेश को सत्र में सहेजें। $_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"); ) /* अनुरोध पूरा करना */ $ परिणाम_query_insert-> बंद करें(); //डेटाबेस से कनेक्शन बंद करें $mysqli->बंद करें();

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

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

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

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


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

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

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

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

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

// फॉर्म को संसाधित करते समय होने वाली त्रुटियों को जोड़ने के लिए एक सेल घोषित करें। $_SESSION["error_messages"] = ""; //सफल संदेशों को जोड़ने के लिए एक सेल घोषित करें $_SESSION["success_messages"] = "";

/* जांचें कि क्या फॉर्म सबमिट किया गया था, यानी क्या लॉगिन बटन पर क्लिक किया गया था। यदि हां, तो हम आगे बढ़ते हैं, यदि नहीं, तो हम उपयोगकर्ता को एक त्रुटि संदेश दिखाएंगे जो यह दर्शाता है कि उसने सीधे इस पृष्ठ तक पहुंच बनाई है। */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) कोड के अगले भाग के लिए जगह )else( बाहर निकलें("

गलती!आपने सीधे इस पृष्ठ तक पहुंच बनाई है, इसलिए संसाधित करने के लिए कोई डेटा नहीं है। आप मुख्य पृष्ठ पर जा सकते हैं.

"); }

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

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

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

गलती!कैप्चा प्रविष्टि फ़ील्ड खाली नहीं होनी चाहिए.

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

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

"); }

यदि उपयोगकर्ता ने सत्यापन कोड सही ढंग से दर्ज किया है, तो हम आगे बढ़ते हैं, अन्यथा हम उसे प्राधिकरण पृष्ठ पर लौटा देते हैं।

डाक पते की जाँच की जा रही है

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

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

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

डाक पता (ईमेल) दर्ज करने का क्षेत्र खाली नहीं होना चाहिए।

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

ईमेल इनपुट फ़ील्ड अनुपलब्ध है

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

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

पासवर्ड सत्यापन

संसाधित करने के लिए अगला फ़ील्ड पासवर्ड फ़ील्ड है। निर्दिष्ट स्थान पर" //(3) पासवर्ड प्रोसेसिंग के लिए स्थान", हम लिखते हैं:

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_auth.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); ) )अन्यथा ( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

पासवर्ड फ़ील्ड गुम है

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

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

अब आपको उस उपयोगकर्ता का चयन करने के लिए डेटाबेस से एक क्वेरी करने की आवश्यकता है जिसका ईमेल पता प्राप्त ईमेल पते के बराबर है और जिसका पासवर्ड प्राप्त पासवर्ड के बराबर है।

// उपयोगकर्ता के चयन के आधार पर डेटाबेस में क्वेरी। $result_query_select = $mysqli->query(''SELECT * FROM `users` WHERE email = ""।$email."" और पासवर्ड = ""।$password."""); if(!$result_query_select)( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

डेटाबेस से उपयोगकर्ता का चयन करते समय क्वेरी त्रुटि

"; //उपयोगकर्ता को पंजीकरण पृष्ठ हेडर पर लौटाएं("HTTP/1.1 301 स्थायी रूप से ले जाया गया"); हेडर("स्थान: ".$address_site."/form_auth.php"); //स्क्रिप्ट से बाहर निकलना बंद करें(); )else( //जांचें कि क्या डेटाबेस में ऐसे डेटा वाला कोई उपयोगकर्ता नहीं है, फिर एक त्रुटि संदेश प्रदर्शित करें यदि($result_query_select->num_rows == 1)( // यदि दर्ज किया गया डेटा डेटाबेस के डेटा से मेल खाता है, तो सेव करें सत्र सरणी में लॉगिन और पासवर्ड। ); ।"/index.php"); )else( // त्रुटि संदेश को सत्र में सहेजें। $_SESSION["error_messages"] .= "

ग़लत लॉगिन और/या पासवर्ड

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

साइट से बाहर निकलें

और आखिरी चीज जिसे हम लागू करते हैं वह है साइट छोड़ने की प्रक्रिया. फिलहाल, हेडर में हम प्राधिकरण पृष्ठ और पंजीकरण पृष्ठ के लिंक प्रदर्शित करते हैं।

साइट हेडर में (फ़ाइल हेडर.php), सत्र का उपयोग करके हम जांचते हैं कि उपयोगकर्ता पहले से ही अधिकृत है या नहीं। यदि नहीं, तो हम पंजीकरण और प्राधिकरण लिंक प्रदर्शित करते हैं, अन्यथा (यदि वह अधिकृत है), तो पंजीकरण और प्राधिकरण लिंक के बजाय हम लिंक प्रदर्शित करते हैं बाहर निकलना.

फ़ाइल से कोड का संशोधित भाग हेडर.php:

पंजीकरण

बाहर निकलना

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

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

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

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

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

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

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

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

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

क्या आपको लेख पसंद आया?

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

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

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

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. यदि $चेक सत्य है, तो हम लिखते हैं कि प्राधिकरण सफल रहा, आदि।

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

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

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

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

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

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

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

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

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

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

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

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

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



मित्रों को बताओ